C++指针和数组的区别(不能混用的情况)

通常情况下,C++中指针和数组是可以混用的,但是,在编写字符数组的全排列的时候,混用却出了问题,因此,今天特地mark一下,以备日后查找

 这里整理的,不包括用new开辟的动态数组

1.数组一旦声明,我们就不能再给它赋值,但是我们可以给指针赋值

如下:

5、6行都错,因为数组s不能作为左值被赋值

报错阶段:程序会在编译时报错

复制代码

int main(){
    char s[]="123";
    char p[]="123";
    char *t=NULL;
    s=t;
    s=p;
}

复制代码

2.用指针定义字符串时,指针所指的字符串会被理解为常量字符串,不能修改。数组定义的字符串则可以修改。

如下:例子中用swap对指针进行修改,比较 s 和 s1 的不同

结果:s1的结果能够正确输出,但是程序会在swap交换s的元素时,在i=j这一句挂掉。

原因即为上面所说,指针声明的字符串是常量的。

报错阶段:程序运行时,直接挂掉

复制代码

void swap(char &i,char &j){
    char t=i;i=j;j=t;
}
int main(){
    char *s="1234";
    char s1[]="1234";
    swap(s1[0],s1[2]);
    printf("%s\n",s1);
    swap(s[0],s[2]);
    printf("%s\n",s);
}

复制代码

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

 3.用sizeof运算符可以计算数组变量的数组大小,但指针指向数组时,只能计算出指针本身大小(单位:字节)

 int main(){
     char *s="1234567890";
     char s1[]="1234567890";
     printf("s:%d  s1:%d  char:%d",sizeof(s),sizeof(s1),sizeof(char));
 } 

运行结果:s:8  s1:11  char:1

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

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

《C专家编程》的笔记-指针与数组的区别

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

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

原文:https://www.cnblogs.com/luruiyuan/p/5616379.html


int getsize(int data[])
{
    return sizeof(data);
}
int_tmain(int argc,_TCHAR *argv[])
{
    int data1[]={1,2,3,4,5};
    int size1=sizeof(data1);
    int *data2=data1;
    int size2=sizeof(data2);
    int size3=getsize(data1);
    cout<<size1<<size2<<size3<<endl;
}
 
 


输出结果为20,4,4

data1是一个数组,sizeof(data1)是求数组的大小。整个数组包含5个整数,一个整数占有四个字节,因此共占有20字节。data2声明为指针,尽管他指向了数组data1的第一个数字,但是他本质仍然是一个指针。在32位系统上,对任意指针求sizeof得到的结果都是4.在把数组作为函数的参数进行传递的时候,数组就自动退化为同类型的指针。因此,尽管函数getsize的参数data被声明为数组,他会退化为指针,size3的结果仍然为4.
--------------------- 
作者:BridgeMa 
来源:CSDN 
原文:https://blog.csdn.net/jacoob1024/article/details/79888523 
版权声明:本文为博主原创文章,转载请附上博文链接!

猜你喜欢

转载自blog.csdn.net/m0_37154839/article/details/85343789