内存存储

字符数组与字符串的区别:它们最根本的区别是在内存中的存储区域不一样。

  • 字符数组存储在全局数据区或栈区,全局数据区和栈区的字符串(也包括其他数据) 有读取和写入的权限,
  • 字符串存储在常量区。常量区的字符串(也包括其他数据)只有读取权限,没有写入权限。

定义区别

  1. char string[] = "abcde";
  2. char charArr[] = {'a','b','c','d','e'}
  3. char c = 'a'
  • 字符串: string[] = “abcde”;
a b c d e \0
  • 数组:charArr[] = {‘a’,’b’,’c’,’d’,’e’}
a b c d e
  • 字符
a

长度

  • strlen 不包括\0
  • sizeof 内存块大小
  1. #define _CRT_SECURE_NO_WARNINGS
  2. #include<stdio.h>
  3. #include<stdlib.h>
  4. #include<string.h>
  5. void main()
  6. {
  7. int size = 0;
  8. int len = 0;
  9. // buf作为字符串数组 应该是5个字节 作为字符串4个字节
  10. char buf[] = "abcd";
  11. char buf3[100] = "ABCDEFG123"; //自动补充0
  12. len = strlen(buf); // 4
  13. size = sizeof(buf); // 5
  14. printf("len = %d\n", len); // 4
  15. printf("size = %d\n", size); // 5
  16. printf("buf: %s\n", buf); // buf:abcd
  17. printf("buf3: %s\n", buf3); // buf3:ABCDEFG123
  18. printf("buf3[88]: %d\n", buf3[88]); // buf3[88]:0
  19. system("pause");
  20. return;
  21. }

通过数组下标 和 指针

  1. #define _CRT_SECURE_NO_WARNINGS
  2. #include<stdio.h>
  3. #include<stdlib.h>
  4. #include<string.h>
  5. void main1()
  6. {
  7. int size = 0;
  8. int len = 0;
  9. // buf作为字符串数组 应该是5个字节 作为字符串4个字节
  10. char buf[] = "abcd";
  11. char buf3[100] = "ABCDEFG123"; //自动补充0
  12. len = strlen(buf); // 4
  13. size = sizeof(buf); // 5
  14. printf("len = %d\n", len); // 4
  15. printf("size = %d\n", size); // 5
  16. printf("buf: %s\n", buf); // buf:abcd
  17. printf("buf3: %s\n", buf3); // buf3:ABCDEFG123
  18. printf("buf3[88]: %d\n", buf3[88]); // buf3[88]:0
  19. system("pause");
  20. return;
  21. }
  22. void main()
  23. {
  24. int i = 0;
  25. char *p = NULL;
  26. char buf[100] = "ABCDE";
  27. printf("%p\n", buf);
  28. /*
  29. 0x0041F708 41 A
  30. 0x0041F709 42 B
  31. 0x0041F70A 43 C
  32. 0x0041F70B 44 D
  33. 0x0041F70C 45 E
  34. 0x0041F70D 00 .
  35. */
  36. // 数组下标形式
  37. for (i = 0; i < strlen(buf); i++) {
  38. //printf("buf[%d]=%d\n", i, buf[i]);
  39. /*
  40. buf[0]=65
  41. buf[1]=66
  42. buf[2]=67
  43. buf[3]=68
  44. buf[4]=69
  45. */
  46. printf("buf[%d]=%c\n", i, buf[i]);
  47. /*
  48. buf[0]=A
  49. buf[1]=B
  50. buf[2]=C
  51. buf[3]=D
  52. buf[4]=E
  53. */
  54. }
  55. // 指针
  56. p = buf; // buf代表数组首元素的地址
  57. for (i = 0; i < strlen(buf); i++) {
  58. printf("buf[%d]=%c\n", i, *p++); // 这里是步长+1
  59. /*
  60. buf[0]=A
  61. buf[1]=B
  62. buf[2]=C
  63. buf[3]=D
  64. buf[4]=E
  65. */
  66. }
  67. // [] *的推导过程
  68. // buf[i] ===>buf[0+i] ===> *(buf+i)
  69. system("pause");
  70. return;
  71. }

输出

  • %c 字符
  • %c %s字符数组
  • $s 字符串
  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. //http://tool.oschina.net/commons?type=4 常用对照表
  4. void main() {
  5. printf("\n-------------------字符-------------------\n");
  6. /**
  7. 字符 putchar printf 对应的格式控制符是%c。
  8. */
  9. int one = 1;
  10. char first = '1';
  11. char code = 'A';
  12. char b = 70;
  13. int c = 71;
  14. //char x = '中'; //char 类型不能包含 ASCII 编码之外的字符
  15. putchar(one);
  16. putchar(first);
  17. putchar("\n");
  18. printf("%d\t %c\n", one, one); // 1 SOH %dASCII码值1 %c ASCII码控制字符SOH
  19. printf("%d\t %c\n", first, first); // 49 1 %dASCII码值49 %c ASCII码控制字符1
  20. printf("%d\t %c\n", code, code); // 65 A %dASCII码值65 %c ASCII码控制字符A
  21. printf("%d\t %c\n", b, b); // 70 F %dASCII码值65 %c ASCII码控制字符A
  22. printf("%d\t %c\n", c, c); // 71 G %dASCII码值65 %c ASCII码控制字符A
  23. char p1, p2;
  24. p1 = 120;
  25. p2 = 121;
  26. printf("%c,%c\n", p1, p2);
  27. printf("%d,%d\n", p1, p2);
  28. printf("\n-------------------字符串-------------------\n");
  29. // 字符串 puts 函数和通用的 printf 对应的格式控制符是%s。
  30. // 在C语言中,字符串总是以'\0'作为串的结束符。
  31. char web_url[] = "http://c.biancheng.net";
  32. char *web_name = "C语言中文网";
  33. puts(web_url); // http://c.biancheng.net
  34. puts(web_name); //C语言中文网
  35. printf("%s\n", web_url); // http://c.biancheng.net
  36. printf("%s\n", web_name); //C语言中文网
  37. printf("\n-------------------字符数组-------------------\n");
  38. char arrCh[] = { 'A','B','1', '中' };
  39. for (int i = 0; i < 4; i++) {
  40. printf("i=%c\t", arrCh[i]); // i=A i=B i=1 i=? '中'是打印不出来的 ASCII码表里不存在
  41. }
  42. system("pause");
  43. return 0;
  44. }