假设有一个int a[ 3 ] [ 4 ] 这样的二维数组,书上说 &a [ i ] 和a+i等

C\u8bed\u8a00\u4e8c\u7ef4\u6570\u7ec4int a[4][3]={{1,2},{4,5},{7},{10}};

\u5c31\u662f\u7ed9\u4f60\u7684\u6570\u7ec4\u8d4b\u503c\uff0c\u5c31\u50cf\u4f60\u6240\u4e3e\u4f8b\u7684\uff0c\u662f\u4e2a\u56db\u884c\u4e09\u5217\u7684\u6570\u7ec4\uff0c\u7b2c\u4e00\u884c\u7684\u521d\u503c\u4e3a1,2,0\uff1b\u7b2c\u4e8c\u884c\u7684\u521d\u503c\u4e3a4,5,0\uff0c\u7b2c\u4e09\u884c\u7684\u521d\u503c\u4e3a7,0,0\uff1b\uff08\u672a\u9644\u5230\u7684\u5143\u7d20\u9ed8\u8ba4\u503c\u4e3a0\uff09

for\u5faa\u73af\u65f6\u5019\u7528\u7684i\u4ece0\u52301\uff0cj\u4e5f\u662f\u4ece0\u52301
\u6240\u4ee5
a[0][0] = 0 + 2 * 0 + 1 = 1
a[0][1] = 1 + 2 * 0 + 1 = 2
a[1][0] = 0 + 2 * 1 + 1 = 3
a[1][1] = 1 + 2 * 1 + 1 = 4

刚写的,如果有疑问,欢迎交流

得一步一步的分析:

这里是有一级指针和二级指针的区别的。

二维数组中a其实是二级指针,a+i指向的是第i行。

而a[0]是一级指针,a[0]+i则指向的是第0行的第i个元素。


而a[0][0]就是元素了。


a[0][0] 是 int类型

a[0]是 int *类型

a 是 int(*) [4] 类型。


&a[0][0] 得到的是int *类型,这里&的作用是取地址

而在二维数组里对&a[0] 得到是 int(*)[4],这里的&不是对地址取地址,而是更多的是类型转换。


因为通过执行下面的程序会发现,a[0], a, &a[0][0], &a[0]的地址都一样的:

#include<stdio.h>
int main(){
int a[3][3];
printf("%d
", a);
printf("%d
", a[0]);
printf("%d
", &a[0]);
printf("%d
", &a[0][0]);
return 0;
}

与之相对的:

int **p; 

p = (int **) malloc(sizeof(int *) * 3);

for(i = 0; i<3; i++)

   p[i] = (int*) malloc(sizeof(int) *3);


这个时候&p[0],得到是指针数组中第一个指针变量的地址。和&p[0][0]和p都是不同的

可以尝试下面的code:

#include<stdio.h>
#include<stdlib.h>
int main(){
int a[3][3];
printf("%d
", a);
printf("%d
", a[0]);
printf("%d
", &a[0]);
printf("%d
", &a[0][0]);

int **tar;
tar = (int**) malloc(sizeof(int*) * 3);
int i = 0;
for(i = 0; i<3; i++)
tar[i] = (int*) malloc(sizeof(int) *3);
printf("%d
", tar);
printf("%d
", tar[0]);
printf("%d
", &tar[0]);
return 0;
}


a[i]指的是元素,&a[i]是取a[i]的地址。
数组名其实就是指针,a表示数组a的首地址,也就是a[0]的地址,所以a+i就是a[i]的地址。

扩展阅读:int a[10]={ }哪里错了 ... 免疫组化结果一览表 ... 若有定义int a 2 3 ... 假设int x2三元表达式 ... 数组定义为int a[4] ... char a 72 包含几个字符 ... 假定aa为一个类 int a ... 0 π 是第几象限 ... 系统函数h s 的定义式 ...

本站交流只代表网友个人观点,与本站立场无关
欢迎反馈与建议,请联系电邮
2024© 车视网