C++指针和数组的区别(不能混用的情况) 《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
",s1);
 9     swap(s[0],s[2]);
10     printf("%s
",s);
11 } 

在vs上调试可以看到报错为:

C++指针和数组的区别(不能混用的情况)
《C专家编程》的笔记-指针与数组的区别

 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

注意,字符串的结束符' '也被sizeof计算在内,因此字符串类型比内容长1,如果是其他基本类型,则sizeof(数组名)/sizeof(类型名)即为数组长度。

 其他的问题,可以参考这个:

更多的区别,待我有空拜读了《C专家编程》之后,再来解决喽

ok~暂时就发现了这么多,拜拜(●'◡'●)