本文系转载,对原文的主要几点进行了提炼,想看更详细的内容,请看原帖:
https://blog.csdn.net/yichu5074/article/details/81701850?utm_source=app
char* p = “How are you?”;
这里双引号做了3件事:1.申请了空间(在常量区),存放字符串。2.在字符串尾加了‘\0’。3.返回地址。
指针p接收的就是字符串的地址,而不是字符串本身。似乎问题到这里就解决了,但原文做了更多的扩展解和释,我这里做了提炼(必有不足之处):
1.为什么可以把字符串赋值给字符指针,却不能给字符数组赋值?
char array[] = “apply this function” ; // 这样是可以的,字符数组的初始化
char array[];
array = “apply this function” ; // 这样是不行的
等号的左边必须是一个左值(在程序中占用内存空间,可以修改的量,相当于变量),而数组名代表的是数组首地址,是常量,不可改变的。
2.指针可以自增,而数组不能自增(指针是地址变量,而数组是地址常量)。
3.void指针不能进行指针运算,也不能进行*取值操作(所指向的对象类型不确定)。
4.字符串是常量的情况:把字符串赋值给字符指针变量(不能修改里面的值)。
char* p = “apply this function” ;
p[0] = ‘a’; // 试图修改第一个字符,不会报错,但输出异常
不是常量的情况:把字符串赋值给字符数组(可以修改里面的值)
char array[] = “apply this function” ;
array[0] = ‘a’; // 可以
5.字符常量的类型可以理解为字符常量数组的类型。例如 “abcd" 的类型可以看成 const char[5]
6.数组的类型是由该数组所存放的元素的类型和数组本身的大小决定。例如,char s1[4] 和 char s2[5] 。s1的类型是char[4], s2的类型是char[5] 。
7.sizeof()函数是用来求类型的字节数。
8.对于函数参数列表中的以数组类型书写的形式参数,编译器会把其解释为普通的指针类型。如对于 void func(char sa[100],int sc[20],char* p), 则sa的类型为char*,sc的类型为
int*,p的类型为char*。
9.int array[] = {1,2,3,4};
printf("%d\n",sizeof(array));
结果是4,因为array的类型为int[4]
char str[] = “What”;
printf("%d\n",sizeof(str));
其结果为5,因为str的类型是char[5]
char str[10] = “What”;
printf("%d\n",sizeof(str));
其结果为10,因为str的类型是char[10]
char* p = “abcdef”;
printf("%d\n",sizeof§);
其结果为4,因为p的类型是char*(指针是用4个字节存放地址)
10.我们再用一组代码来看指针与数组的区别。
int inter[] = {
1,56,78,9,0
};
printf("%d\n",&string);
printf("%d\n",string);
printf("%d\n",&string[0]);
printf("\n\n");
char* p = "what";
printf("%d\n",&p);
printf("%d\n",p);
printf("%d\n",&p[0]);
其结果为:
可以看到指针变量p有自己的内存地址。