读书人

C中数组和指针的区别求底层数组结构

发布时间: 2012-04-27 11:57:44 作者: rapoo

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了,原因就是编译器已经不知道他原来的定义格式了。
[解决办法]
探讨

有一些明白了,那么格式化的指针的定义结构是什么呢?
类似结构题的方法么?
结构中一个指针变量,一个int变量(数组长度)
然后sizeof的时候就参考这个int变量求长度?
还是有其他的类型定义,其实我就是想搞懂这个内部的结构……

读书人网 >C语言

热点推荐