C中数组和指针的区别,求底层数组结构
大家都知道C中数组和指针的结构是有一些区别的
比如
- C/C++ code
void main(){ int *p = (int *)malloc(25* sizeof(int)); int c[25]; printf("%d\n",sizeof(p)); printf("%d\n",sizeof(c));}打印结果是
100
4
显然,指针类型直接存储的就是指针,4字节没错
而数组变量名平时我们可以和指针通用,如c[5] = 3;p[6]=4;等等
但用sizeof求数组名的结果却能得到整个数组的长度,显然,数组类型中还存储有其他的一些说明,
在此希望获得数组类型的底层结构
各位大侠块来啊!
[解决办法]
4
100
Press any key to continue
LZ我会说我看着变扭,自己跑了一下?
[解决办法]
一个指针p,无论是整形int*,字符型char*,还是结构体struct node*,还是函数(*p)(),
sizeof p的值始终是4。这个4是指4byte(32位机子)。至于p里面的值,就看你怎么赋值。
如果通过强制转换,可以指向4G内存的任何地方,它是个变量,可以改变。
数组char a[10],在内存里连续的地方开辟了一个空间,这个空间站了10*sizeof (char)字节。
和p相同的地方是,a是指向这个数组第一个元素的地址,a是一个地址!!
我们平时定义变量char x, y; x和y拿来可以直接用。但a[10]里面有10个变量,我们所拥有的,
只是这连续10个变量中第一个元素的地址a,要访问之后的元素就需要用到*(a+i)或a[i]。
与p不同的地方是,a是不能改变,无法对它进行 a++这种操作。
[解决办法]
数组名是一种特殊的指针,它和指针一样有自己的指向类型,但每一次加法加的却不是指向类型的尺寸。数组空间可以用指针访问也可以用数组名访问,但用数组名访问时受到的限制更大。
[解决办法]
给你个程序。
- C/C++ code
#include <stdio.h>#include <stdlib.h>int main(void){ char *str1 = "abcde"; char str2[] = "abcde"; /* str1是字符串指针,是存储在常量区的 ,&str1是一个普通的指向指针的变量,存放在栈区 */ printf("%x\n%x\n", str1, &str1); printf("\n"); /* str2是数组名,是一个局部变量,&str2也是一个局部变量,都存储在栈区 */ printf("%x\n%x\n", str2, &str2); return 0;}
[解决办法]
x86架构,指针的sizeof是4bytes,如果x64上指针的sizeof就不是4了,p是一个指针变量,指向另一片区域,而这个指针变量的size就是4
数组,如果要说它的底层结构其实就是一段内存,c表示数组的首地址,也是这片内存的首地址,如果sizeof(C)得到的就是这片内存size
[解决办法]
c 的指针和数组实质都是指针;
只不过数组是格式化后的指针,可以把int * a:看成是一个int a[1]型的数组。
至于用sizeof获取一个指针的长度,很明显,c是差不多算高级语言,
自身的数据类型的意义就是进行结构化操作,因此,你定义了 int b【3】
sizeof(b)结果自然是12,如果你把这个b在代码传到其他函数中去,在用
sizeof(b)那结果就是4了,原因就是编译器已经不知道他原来的定义格式了。
[解决办法]