美文网首页
c语言 char *和char[]的区别

c语言 char *和char[]的区别

作者: python小青 | 来源:发表于2019-10-04 23:34 被阅读0次

    最近复习了下c语言,以前学习它只是为了应付考试,现在重新学习下,写写文章只是想着,哪天年龄大了,忘记了,再回头来翻看一下,如果其中有什么不对的地方,也请劳烦指正哈。

    #include <stdio.h>

    #include <string.h>

    int main(){

    char * buf = "123";

    char * buf1 = "123";

    char buf2[] = "123";

    char buf3[] = "abc";

    char buf4[10];

    char * buf5 = strcpy(buf4,buf3);

    char *str1 = (char*) malloc(4 * sizeof(char));

    str1[0] = 'a';

    str1[1] = '\0';

    printf("buf的地址:%p\n",buf);

    printf("buf1的地址:%p\n",buf1);

    printf("buf2的地址:%p\n",buf2);

    printf("buf3的地址:%p\n",buf3);

    printf("buf4的地址:%p\n",buf4);

    printf("buf5的地址:%p\n",buf5);

    printf("str1的值:%s\n",str1);

    printf("size of buf1: %d\n", sizeof(buf1));

    printf("size of buf2: %d\n", sizeof(buf2));

    printf("buf1长度为:%d ,buf2长度为:%d\n", strlen(buf1), strlen(buf2));

    buf2[0] = 'a';

    printf("buf2的值:%s\n",buf2);

    printf("buf2的地址:%p\n",buf2);

    free(str1);

    str1 = NULL;

    return 0;

    }

    执行结果如下:

    结论1️:char * buf = "123";//buf指针创建于栈区,它指向的“123”位于字符串常量区;char * buf1 ="123";//buf1指针创建于栈区,它指向的“123”位于字符串常量区;由上面的地址打印可以知道buf和buf1都指向同一块地址,正是指向常量区的原因buf[0]= 'a';这样的操作会报错,常量区内容不可修改。

    结论2:char buf2[] ="123";//buf2变量创建于栈区,“123“同样存储于栈区,所以我们执行 buf2[0] ='a';后再次打印buf2的值将变为”a23“,而buf2的地址没变。buf2指向数组的第零个元素,不可修改其指向,例如buf2++是会报错的。

    结论3:char buf4[10];buf4变量创建于栈区,其分配的空间也在栈区,char * buf5 = strcpy(buf4,buf3);//新生成的指针变量buf5指向buf4,buf4在执行strcpy前要有足够的空间来存放buf3;

    注意4:通过malloc创建数组分配在堆区,而指向它的指针变量创建于栈区。

    注意5:sizeof(buf1)是计算的buf1这个指针的占用空间大小,指针大小在32位电脑上上占4个字节,在64位上占8个字节;sizeof(buf2)占四个字节是因为数组buf2”123”(末尾'\0')一共四个字符共占四个字节。strlen函数是计算截止到‘\0’时字符的个数(不包含'\0')。

    相关文章

      网友评论

          本文标题:c语言 char *和char[]的区别

          本文链接:https://www.haomeiwen.com/subject/zhospctx.html