指针和数组的区别

2024年11月17日 23:48
有5个网友回答
网友(1):

C++/C程序中,指针和数组在不少地方都是可以相互替换使用的,这就让人产生一种错觉,以为两者是等价的。
数组或是在静态存储区被创建(全局数组),或是在栈上被创建。数组名对应着,注意不是指向,一块内存,其地址与容量在生命期内保持不变(当然,使用了realloc()的不算),只有数组的内容可以改变。
指针可以随时指向任意类型的内存块,它的特征是“可变”,所以我们常用指针来操作动态内存。指针远比数组灵活,当然也就更危险。

区别之一:

char a[] = "hello";
a[0] = 'X';
cout << a << endl;
char *p = "world"; // 注意p指向常量字符串
p[0] = 'X'; // compiler不能发现该错误,不过在运行的时候会发生runtime error
cout << p << endl;

区别之二:

用运算符sizeof可以计算出数组的容量(字节数)。比如对应上面的代码,sizeof(a)的值是12(包括最后面的'\0')。指针p指向a,但是sizeof(p)的值却是4。这是因为sizeof(p)得到的是一个指针变量的字节数,相当于sizeof(char*),而不是p所指的内存容量siziof(char[6])。C++/C不能知道指针所指的内存容量。
值得注意的是,当数组作为函数的参数进行传递时,数组就自动退化为同类型的指针。那么不论数组a的容量是多少,sizeof(a)始终等于sizeof(char *)。

网友(2):

p+i是指针向后移了一个
比如*p=a[0],那么*(p+i)=a[i]
a+2
a[10]中的a表示数组a[10]首地址
那么a+2就是a[0+2]=a[2]
p++和p=p+1等同
这个意思是改变指针指向,使之指向下一个.
p-a是表示相差几个元素
a是数组首地址但记住他不是指针
所以对他的运算操作都是无意义的

网友(3):

没其他区别了应该
传入后没什么区别,一个是传常量指针,另一个传变量指针,但接受的都是一个变量,根本反映不出来有区别
是整形的,tubo C 中2个字节存储
vc 中4个字节存储

网友(4):

c语言中在绝大部分情况下两者用法一样,都表示一个地址。区别是指针是个变量,可以赋值,而数组是个常量,不能赋值。
如:
char a[12];
char b[12];
char *p;
p = a; //合法
p = b; //合法
a = b; //不合法
b = a; //不合法

网友(5):

1. 可以把数组理解成一个常量指针,事实上里面存放的确是就是个地址,但这个地址后面会顺序存放数组元素,这个要明确。
2. 在函数中,传入的数组会退化为指针。
3. sizeof一个指针和sizeof一个int的值,在同一个编译环境下是相同的。

关于更具体的,c++有很多好书详细说了这些,c++ primer还有高质量c++。