C++指针和数组的区别(不能混用的情况)
通常情况下,C++中指针和数组是可以混用的,但是,在编写字符数组的全排列的时候,混用却出了问题,因此,今天特地mark一下,以备日后查找
这里整理的,不包括用new开辟的动态数组
1.数组一旦声明,我们就不能再给它赋值,但是我们可以给指针赋值
如下:
5、6行都错,因为数组s不能作为左值被赋值
报错阶段:程序会在编译时报错
1 int main(){ 2 char s[]="123"; 3 char p[]="123"; 4 char *t=NULL; 5 s=t; 6 s=p; 7 }
2.用指针定义字符串时,指针所指的字符串会被理解为常量字符串,不能修改。数组定义的字符串则可以修改。
如下:例子中用swap对指针进行修改,比较 s 和 s1 的不同
结果:s1的结果能够正确输出,但是程序会在swap交换s的元素时,在i=j这一句挂掉。
原因即为上面所说,指针声明的字符串是常量的。
报错阶段:程序运行时,直接挂掉
1 void swap(char &i,char &j){ 2 char t=i;i=j;j=t; 3 } 4 int main(){ 5 char *s="1234"; 6 char s1[]="1234"; 7 swap(s1[0],s1[2]); 8 printf("%s\n",s1); 9 swap(s[0],s[2]); 10 printf("%s\n",s); 11 }
在vs上调试可以看到报错为:
3.用sizeof运算符可以计算数组变量的数组大小,但指针指向数组时,只能计算出指针本身大小(单位:字节)
1 int main(){ 2 char *s="1234567890"; 3 char s1[]="1234567890"; 4 printf("s:%d s1:%d char:%d",sizeof(s),sizeof(s1),sizeof(char)); 5 }
运行结果:s:8 s1:11 char:1
注意,字符串的结束符'\0'也被sizeof计算在内,因此字符串类型比内容长1,如果是其他基本类型,则sizeof(数组名)/sizeof(类型名)即为数组长度。
其他的问题,可以参考这个:
《C专家编程》的笔记-指针与数组的区别
更多的区别,待我有空拜读了《C专家编程》之后,再来解决喽
ok~暂时就发现了这么多,拜拜(●'◡'●)