这个问题其实问的非常好,我也被困扰了很久很久。但是网上的答案基本都是答非所问。我自己查了很多资料,也写了很多测试语句。我觉得:
1 C语言里面没有string这个类型的数据,就比如说有int char float double之类的数据类型,但是字符串这这数据类型在c语言里面是没有的。这个其实非常的不人性化,因为我们在看很多程序代码的时候会发现经常要使用到字符串,而且有一个很重要的函数库就叫做string.h里面的函数在我们日常编程中,全部是非常基础但同时又是非常重要的。所以我个人觉得c语言没有字符串类型这一点,让字符串指针和别的指针概念相比非常难以理解。
2 稍微说一下指针的基本概念。指针就是一块内存的地址编号。地址编号和地址里面存储的东西这两个概念是指针有关的书籍里面讲了无数遍的。一般理解起来是没有任何难度的。但是当我们创建一个指针变量的时候,一定要注意把申请的这个变量和一块内存的地址绑定起来。int *p = 3;//这就是一个经典的错误例子。 a=3; int *p = &a; //绑定一个内存的地址非常重要,绑定了之后再使用,比如a=3; int*p=&a; *p=100;这都是可以的。但是如果没有p=&a;这一步,那么肯定就会报错。如果以后用结构体指针,同样要先malloc一下,作用还是把一个新申请的指针变量绑定到一个内存地址上面去,至于绑定到哪里,这一块内存地址长度多少,就动态的由malloc(sizeof())来决定了.当然也需要稍微看一下内存的基本知识,明白堆区,栈区,静态储存区等基本概念,知道变量,常量,全局,局部,函数代码都存在哪些区域里也很重要。这些知识看似对于指针理解没有直接的帮助,其实指针深究到最后,就是这些东西了。
3 现在来说一下char *p 首先它是一个常量,如果是char p[10] = {};那么它就是一个变量。常量的值只可以读取不可以写入,变量的值可读可写。
在用printf语句打印%s的时候,printf语句要求提供字符串首地址。这是printf所规定的,也就是看到%s,printf就要求指针变量,而不是我们逻辑上认为的指针里面所存储的内容。所以用printf("%s",p);而不是printf("%s",*p); 这一点必须记住。如果用%c,想输出里面的内容就可以按照正常的指针概念,用*p了。你可以执行一下这一条语句char * p = "string pointer dam fucking sucks!"; printf("%s\n%p\n%c\n", p, p, *p);你就应该明白了。
作者:Michael
链接:https://www.zhihu.com/question/55668469/answer/309056728
若有侵权,联系我马上删除!