int a[3][4] 为什么a和*a的值是一样的?他们两者之间又什么关联么?

如题所述

a 是二维数组的首地址,*a等价于*(a+0)等价于a[0]也等价于0[a],也就是第0行的首地址,当然a和*a的值是一样的,但二者的类型是不一样的。


#include<stdio.h>


int main(){

    

    int a[3][4];

    

    printf("a = %d\tsizeof(a) = %d\n",a,sizeof(a));

    printf("*a = %d\tsizeof(*a) = %d\n",*a,sizeof(*a));

    system("pause");

    return 0;

}


追问

请问可以理解成对于a的操作可以是整个数组的,而*a是仅局限于第0行么?(刚学指针进阶不大懂,,,)

追答

对数组而言,数组名称代表的就是数组的首元素的首地址。

而对数组名称的&运算符,就是返回指向一个数组的指针。

这两个数据对数组而言,自然是相同的。但是单位是不一样的。

指针的类型决定了它每次STEP的单元数。

温馨提示:内容为网友见解,仅供参考
第1个回答  推荐于2016-04-15
a 和*a都是了二维数组的第一个元素的地址,也就是 &a[0][0]
但是a+1和*a + 1是不同的
a + 1的内容是 第二行的第一个元素的地址:&a[1][0]
*a + 1的内容是 第一行的第二个元素的地址: &a[0][1]追问

请问为什么会有这样的差别呢?

追答

因为a和*a的类型不同

a的类型是const int (*)[4],也就是说a是指向一个维度为4的整形数组的指针,所以a++会移动4*4个字节。
*a的类型是const int *,也就是*a是指向一个整形数组的首元素,a++会移动4个字节。

本回答被提问者采纳

int a[3][4] 为什么a和*a的值是一样的?他们两者之间又什么关联么?
a 是二维数组的首地址,*a等价于*(a+0)等价于a[0]也等价于0[a],也就是第0行的首地址,当然a和*a的值是一样的,但二者的类型是不一样的。include<stdio.h> int main(){ int a[3][4];printf("a = %d\\tsizeof(a) = %d\\n",a,sizeof(a));printf("*a = %d\\tsizeof(*a)...

求问c语言大神: int a[3][4] 那么a,*a,&a是什么类型?有什么区别?
a是表示二维数组的首地址,其值相当于 &a[0][0] 本身是常量指针 不能改变其值。a是行的首地址 也就是&a[0] 如果你把(*a)+1 那么值就是 &a[1]&a值和a一样,但意义不同,a表示数组首地址,a+1就变成第二个元素地址(int 每个元素地址相隔4)&a表示整个数组,&a+1就直接...

int a[3][4]; 那么 a,*a,**a分别代表什么?
声明 int a[3][4];那么语句中 a,*a,**a分别代表什么呢?a 代表 数组的首地址。a 代表 &a[0][0] 的地址。a 代表 a[0][0] 的 值。--- c 语言 语句中 方括号 不是标点符号,而是 运算符!关于 方括号 的 恒等式:a[j][i] = (a[j])[i] = ( *(a+j))[i] =...

在指针中,先定义int a[3][4],则a+1和&a[1]表示行地址吧,a[1],*(a+...
a表示第一个班长,那么a+1就表示了第二个班长,也就是属排长管的范围,属行地址。a[1],取行地址所指向的值了,就地址降级,也就是降到班长所管的范围,也就表示具体的a[1][0]的地址了,然后再&a[1],又地址升级,就变成排长管的范围,也就变成行地址,也就表示第1行的地址。(a+1):首先a...

int *a[3][4]是什么意思
int **a[3][4]是双指针类型的2维数组,int *a[3][4]是指针类型的2维数组,二维数组本质上是以数组作为数组元素的数组,即“数组的数组”。

short int a[3][4],*ptr;a和a[0]有什么区别?a里面储存的是3个一位...
a[i]的数据是a[i][0]的地址。那a是什么呢?a是当然指针,指向a[0],刚才说过a[0]也是指针,所以a是指向指针的指针,类型为 short**。你在代码里加上这两句试试:short **ptr1;ptr1=a;for (i=0;i<3;i )for (j=0;j<3;j )printf("d\\n", (*ptr) );...

c语言中inta[3][4]什么含义啊?
a[2][0]=0 int a[3][4]表示定义一个3行4列的整型数组a;{{3,4},{2,8,6}}表示初始化数组。{中的每一个{}表示依次对每一行赋值,不够的补0},所以{{3,4},{2,8,6}}表示对数组的前两行赋值,每行也是依次赋值,不足补0;int a[3][4]={{3,4},{2,8,6}} 最终数组存储...

int a[3][4]为什么要用int (*p)[4]而不是int (*p)[3]或int (*p)[5]
int a[3][4]是一个二维数组,可以认为是一个三行四列的平面数组。二维数组的每行都是一个一位数组。那么这个二维数组是一个有三个一维数组组成的数组,其中每个一维数组有四个元素。int (*p)[4]的意思是定义一个指向一维数组的指针,这个指针指向二维数组的第一行数组的第一个元素,也就是指向了...

c语言中,数组名的前面加*, 如a[3][4]; *a输出的是什么结果
它的值是个int型数值,也就是第1个元素1,而二维数组中的a[3]里存放的是三个元素(3个一维数组)的首地址,因此得出一个结论,二维数组里的第一维就是一个指针数组,每个指针指向三个元素(3个一维数组)的首地址。从而**a就是取第一维里第一个元素(1维数组)里的第1个元素的值。

假设有一个int a[ 3 ] [ 4 ] 这样的二维数组,书上说 &a [ i ] 和a...
a 是 int(*) [4] 类型。&a[0][0] 得到的是int *类型,这里&的作用是取地址 而在二维数组里对&a[0] 得到是 int(*)[4],这里的&不是对地址取地址,而是更多的是类型转换。因为通过执行下面的程序会发现,a[0], a, &a[0][0], &a[0]的地址都一样的:include<stdio.h>int main...

相似回答