#include <stdio.h> #include <string.h> int main(void) { //这是字符数组赋初值的方法 char s1[]= {'T','a','o','T','a','o','s' ,'b'}; //char s1[]= "ljsgjlsgjslgjslgj"; //这是字符串赋初值的方法 char s2[]= "taotaosb"; //用sizeof()求长度 printf("s1's length is %d\n", sizeof(s1)); //长度为8 printf("s2's lenght is %d\n", sizeof(s2)); //长度为9,最后一位自动添加了 一个'\0' //用printf的%s打印内容 printf("s1=%s\n", s1); //不能正确显示 printf("s2=%s\n", s2); //可以正确显示 printf("%x\n",s1); printf("%x\n",s2); printf("s1' length is %d\n", strlen(s1)); //不正确的结果 printf("s2's length is %d\n", strlen(s2)); //NULL不在计算范围 return 0; }
#include <stdio.h> #include <string.h> #include <stdlib.h> int main(void) { char a[30]; char *b = (char *)malloc(20 * sizeof(char)); printf("%d\n", sizeof(a)); //30 printf("%d\n", sizeof(b)); //4 printf("%d\n",sizeof(&a[3])); //4 printf("%d\n", sizeof(a[3])); //1 printf("%d\n", sizeof(b+3)); //4 printf("%d\n", sizeof(*(b+4))); //1 return 0 ; }结果:
#include <stdio.h> #include <string.h> int main(void) { int i; //字符数组的一种赋值方法 char s1[][2] = {{'S','B'}, {'A','B'}, {'d','A'}, {'s','\0'},}; //用字符串对字符数组进行赋值的 一种方法 char s2[][3] = {"SB","AB","dA","s"}; for(i = 0;i < 4;i++) { printf("i = %d ,s1[i] =%d , s2[i]= %d\n",i,sizeof(s1[i]),sizeof(s2[i])); printf("s1[i] = %s s2[i] = %s\n", s1[i], s2[i]); } }
eg1:
char* s=”hello”; s[0]='a';//wrong!运行时显示为“段错误”。运行的时候 “hello” 是常量字符串,存放在常量存储区。该区的值是只读的。任何试图修改该存储区值的都会判定为错误。 s指针 指向 常量存储区的 这个字符串。所以你试图改变 值会出现段错误。而你定义字符数组,可以对字符数组修改的。看下面的例子:
#include <stdio.h> #include <string.h> int main() { char *s1 = "hello"; char s2[] = "hello"; //s1[0] = 'a'; 这句话是错误的 s2[0] = 'a'; printf("s1= %s\n",s1); printf("s2= %s\n",s2); return 0; }运行结果:
S2在运行的时候在栈中 专门 分配了内存空间给s2数组的,所以可以对其中的元素 进行修改。在看下一个区别:
2作为返回值时不同。
char* test(){
char ch[5]={'h','i'};//gcc 会警告:返回局部变量。
return ch;
}
ch指向在函数中分配的内存,这片区域在函数执行过后会释放的,如果你去访问的话会造成不可预期的后果。例子:#include <stdio.h> #include <string.h> char *test() { char ch[10] = "hello"; //char *s = "hello"; return ch; } int main() { char *s = test(); printf("s=%s\n",s); return 0; }执行结果:
char *test() { // char ch[10] = "hello"; char *s = "hello"; return s; }s是指向 常量区的东西。这篇常量区的东西,在整个程序执行完之前使用 是应该没问题的。所以 打印结果是正常的:
#include <stdio.h> #include <string.h> void hehe(char *str) //转小写 { int i=0; while(str[i]!='\0') { if(str[i]>='A' && str[i]<='Z') str[i]+=32; i++; } str[i]='\0'; printf("%s\n",str); } int main() { char s[] = "TAOTAOSB"; hehe("taotaosb");//第1 中传递方法, hehe(s); // 第2中 传递方法。 return 0; }
#include <iostream> #include <stdio.h> #include <string.h> int main(void) { char s[] = "123456789"; char d[] = "123"; strcpy(d,s); printf("%s ,\n %s",d,s); return 0; }
低地址 <<<----------------高地址 1 2 3 \0 1 2 3 4 5 6 7 8 9 \0 | | d数组 s数组前面4个 字节是d数组的,后面的10个字节是s数组的,发生复制函数之后,栈中内存位置上的变化为:
低地址 ----------------->>>高地址 1 2 3 4 5 6 7 8 9 \0 6 7 8 9 \0 | | d数组 s数组