内存存储
字符数组与字符串的区别:它们最根本的区别是在内存中的存储区域不一样。
- 字符数组存储在全局数据区或栈区,全局数据区和栈区的字符串(也包括其他数据) 有读取和写入的权限,
- 字符串存储在常量区。常量区的字符串(也包括其他数据)只有读取权限,没有写入权限。
定义区别
char string[] = "abcde";char charArr[] = {'a','b','c','d','e'}char c = 'a'
- 数组:charArr[] = {‘a’,’b’,’c’,’d’,’e’}
长度
#define _CRT_SECURE_NO_WARNINGS#include<stdio.h>#include<stdlib.h>#include<string.h>void main(){ int size = 0; int len = 0; // buf作为字符串数组 应该是5个字节 作为字符串4个字节 char buf[] = "abcd"; char buf3[100] = "ABCDEFG123"; //自动补充0 len = strlen(buf); // 4 size = sizeof(buf); // 5 printf("len = %d\n", len); // 4 printf("size = %d\n", size); // 5 printf("buf: %s\n", buf); // buf:abcd printf("buf3: %s\n", buf3); // buf3:ABCDEFG123 printf("buf3[88]: %d\n", buf3[88]); // buf3[88]:0 system("pause"); return;}
通过数组下标 和 指针
#define _CRT_SECURE_NO_WARNINGS#include<stdio.h>#include<stdlib.h>#include<string.h>void main1(){ int size = 0; int len = 0; // buf作为字符串数组 应该是5个字节 作为字符串4个字节 char buf[] = "abcd"; char buf3[100] = "ABCDEFG123"; //自动补充0 len = strlen(buf); // 4 size = sizeof(buf); // 5 printf("len = %d\n", len); // 4 printf("size = %d\n", size); // 5 printf("buf: %s\n", buf); // buf:abcd printf("buf3: %s\n", buf3); // buf3:ABCDEFG123 printf("buf3[88]: %d\n", buf3[88]); // buf3[88]:0 system("pause"); return;}void main(){ int i = 0; char *p = NULL; char buf[100] = "ABCDE"; printf("%p\n", buf); /*0x0041F708 41 A0x0041F709 42 B0x0041F70A 43 C0x0041F70B 44 D0x0041F70C 45 E0x0041F70D 00 .*/ // 数组下标形式 for (i = 0; i < strlen(buf); i++) { //printf("buf[%d]=%d\n", i, buf[i]); /*buf[0]=65buf[1]=66buf[2]=67buf[3]=68buf[4]=69*/ printf("buf[%d]=%c\n", i, buf[i]); /*buf[0]=Abuf[1]=Bbuf[2]=Cbuf[3]=Dbuf[4]=E*/ } // 指针 p = buf; // buf代表数组首元素的地址 for (i = 0; i < strlen(buf); i++) { printf("buf[%d]=%c\n", i, *p++); // 这里是步长+1 /*buf[0]=Abuf[1]=Bbuf[2]=Cbuf[3]=Dbuf[4]=E*/ } // [] *的推导过程 // buf[i] ===>buf[0+i] ===> *(buf+i) system("pause"); return;}
输出
#include<stdio.h>#include<stdlib.h>//http://tool.oschina.net/commons?type=4 常用对照表void main() { printf("\n-------------------字符-------------------\n"); /**字符 putchar printf 对应的格式控制符是%c。*/ int one = 1; char first = '1'; char code = 'A'; char b = 70; int c = 71; //char x = '中'; //char 类型不能包含 ASCII 编码之外的字符 putchar(one); putchar(first); putchar("\n"); printf("%d\t %c\n", one, one); // 1 SOH %dASCII码值1 %c ASCII码控制字符SOH printf("%d\t %c\n", first, first); // 49 1 %dASCII码值49 %c ASCII码控制字符1 printf("%d\t %c\n", code, code); // 65 A %dASCII码值65 %c ASCII码控制字符A printf("%d\t %c\n", b, b); // 70 F %dASCII码值65 %c ASCII码控制字符A printf("%d\t %c\n", c, c); // 71 G %dASCII码值65 %c ASCII码控制字符A char p1, p2; p1 = 120; p2 = 121; printf("%c,%c\n", p1, p2); printf("%d,%d\n", p1, p2); printf("\n-------------------字符串-------------------\n"); // 字符串 puts 函数和通用的 printf 对应的格式控制符是%s。 // 在C语言中,字符串总是以'\0'作为串的结束符。 char web_url[] = "http://c.biancheng.net"; char *web_name = "C语言中文网"; puts(web_url); // http://c.biancheng.net puts(web_name); //C语言中文网 printf("%s\n", web_url); // http://c.biancheng.net printf("%s\n", web_name); //C语言中文网 printf("\n-------------------字符数组-------------------\n"); char arrCh[] = { 'A','B','1', '中' }; for (int i = 0; i < 4; i++) { printf("i=%c\t", arrCh[i]); // i=A i=B i=1 i=? '中'是打印不出来的 ASCII码表里不存在 } system("pause"); return 0;}