㈠ c语言数组的地址
其实你这个疑问是概念上的混淆,或者说对指针了解上上的欠缺
首先讲int a[3] = {2,3,4};
这里的a是这个数组的首地址,比如定义如:int *p = a;这时如果你进行如下操作:
p++;
printf("%d\n",*p);
结果会是输出2,也就是说p+1相当于数组索引加1,但是像你所问的为什么&a和a是相同的 ,首先要知道他们分别代表什么意思,a:像上面所说的是数组的首地址,做自加运算会根据数组类型来计算偏移量,那么&a是什么东西呢,实际上它也是一个指针,是指向一个具有3个元素的数组的指针,如何理解,看以下定义:
如果你定义int *q = &a;这时编译器肯定报错,绘制出数据类型不一致,那么你这样样定义就没有问题:int (*q)[3] = &a;这时如果你再对q进行++操作,那么加的就不同了,如相面的p++操作后p的值会加4,而这里q++操作后的值会加12,也就是跳过3个数组元素,然而,确实这两个指针的初始值是一样的,只是类型不一样而已,这对二维数组的访问时很方便的,这个你可以参照2维数组得到进一步理解,讲的有点乱,不知道你能不能理解
㈡ c语言中把数组名作为该数组的什么即数组中第一个元素的存储地址
c语言中把数组名作为该数组的首地址,即数组中第一个元素的存储地址。如果有定义int a[10],*p;
则以下三个语句的作用是完全相同的:
p=a;
p=&a[0];
p=&a;
㈢ C语言中整型数组的每个元素在内存中是如何存放的
整型数组每个元素在内存中连续存储,每个整型元素存储方式取决于机器硬件。
一、数组元素都是连续存储的,地址依次从低到高。
如字符数组 char a[10];
其元素有10个,为a[0]到a[9], 地址连续。 如果a的起始地址为0x1234,那么后续地址依次为0x1235, 0x1235...0x123D。
二、每个元素具体存储方式,取决于CPU。 有两种:
1、小端(Little Endian):
将低序字节存储在起始地址(低位编址), 地址低位存储值的低位,地址高位存储值的高位 。
目前大多数CPU是按照这种方式存储的,包括intel和移动端最常见的arm。
比如4字节整型值为0x12345678的情况,那么在内存中会存储为:
0x78 0x56 0x34 0x12
2、大端(Big Endian):
与小端相反, 将高序字节存储在起始地址(高位编址),地址低位存储值的高位,地址高位存储值的低位。
之前的例子在大端情况下存储为:
0x12 0x34 0x56 0x78
㈣ C语言数组存放其他数组地址
这个很简单啊
intarr0[]={1,2};
intarr1[]={1,2};
intarr2[]={(int)arr0,(int)arr1};
printf("%d",*((int*)arr2[0])+1);//访问数据
大概就是这样
㈤ C语言,数组,内存存放地址
应该是a[1][3];
因为二维数组就像矩阵一样,前一个下标表示第i行,后一个下标表示第j列。
具体如下:
a[0][0],a[0][1],a[0][2],a[0][3],a[0][4],a[0][5]
a[1][0],a[1][1],a[1][2],a[1][3],a[1][4],a[1][5]
a[2][0],a[2][1],a[2][2],a[2][3],a[2][4],a[2][5]
从第一行开始数,从左往右依次是第一个a[0][0],第二个是a[0][1]……
直到第一行数完有从第二行开始,所以第十个是a[1][3].
㈥ C语言:数组的值是地址
不对。
数组名是数组的首地址,就是数组中第一个元素的地址,是常量。常量是不能出现在赋值号=左边作为左值的。楼上的都没有解释清楚,说数组名就是指针是错误的,指针是变量,是用来存储变量地址值的变量,而数组名是常量。一般情况下声明一个数组,比如char a[10];之后,数组名a都是数组的首地址,是一个地址常量。但是在函数声明的形参列表中除外。比如:int foo(char a[10]);在这种情况下这样的声明与int foo(char a[]);int foo(char * a);是等价的,就是说这种情况下,就算你写的是数组的形式,编译器实际处理的时候也当指针来处理(注意指针是变量,形参也是变量,二者刚好对应)。所以在函数foo内部,你对a进行++, --, +=,=之类的带赋值的操作是完全合法的,因为此时a就是一个指针,不是数组名,当你往函数foo里面传入一个已经事先声明的数组的首地址时候,指针a里面的值就是你这个已经声明的数组的首地址,这样你在foo里面就可以对你那个数组进行操作,正是因为C有这个传地址的优点,所以省略了很多不必要的拷贝工作,试想如果没有这个传地址,你传一个有几万个元素的数组进去,那拷贝工作是相当可观的。这样,你该明白了int main(int argc, char ** argv);里面为什么可以对argv进行++操作了,既然“main函数的第二个形参是一个指向字符串的指针数组”,argv出现在函数声明中,所以它实际上是一个指针,它并不是“一个指向字符串的指针数组”,而是一个可以获取“一个指向字符串的指针数组”的首地址值的变量。
㈦ c语言数组、地址问题请高手解释
定义了数组a,则机器在内存当中给数组a开辟一片内存存储数组a,数组a的元素是顺序存储的,所以说数组a所在的地址就是数组a第一个元素所在的地址,这两个指针(&a,&a[0])其实算是指向同一个地址的,所以打印出来的数值是相同的。
%p应该是64位32进制形式输出,%d是十进制形式输出的。&a[0]跟a其实是一回事,是相等的,所以第一行的第二个数,换算成十进制就跟第二行的第一个数是相等的。0x22FE30=2293296。
㈧ C语言中,数组在内存中占一片()的存储区,由()代表它的首地址。
数组在内存中占一片(连续)的存储区,由(首元素的地址)代表它的首地址
数组名是一个(指针)常量,不能对它进行赋值运算