指针-关于二维数组a中,a[1] 与 &a[1]相等的一个疑问?(从来没弄懂)

问题描述

关于二维数组a中,a[1] 与 &a[1]相等的一个疑问?(从来没弄懂)

对二维数组a[][]来说,a[1] 与 &a[1]相等。我来分析一下我的误解:
首先,a[m] 里面的内容是一个一维数组的首地址。
而 &a[m] 是 a[m] 的地址,它们相等。
说明 a[m] 的内容其实就是他本身的地址编号 (把 a[m] 看成一个变量)

对于一个内容就是地址的变量m,&m 与 m 相等 毋庸置疑。

然而 &a[m][0] 也等于 a[m]
说明 a[m][0] 的地址 就是 a[m] 的内容 , 也就是 a[m] 的地址;
那么,a[m][0] 与 a[m] 就是在同一地址上的不同变量名了(我知道变量这种说法不太准确)

但是,同一个地址,a[m][0] 与 a[m] 的内容确是截然不同,为什么。

我希望那位朋友能耐心看完我的想法,帮我走出误区,感激不尽!

解决方案

 对于二维数组a[m][n]
a 表示 int (*)[m]
&a 表示 int (*)[m][n]
a[m] 表示 int *
&a[m] 表示 int (*)[m]
a[m][0] 表示 int
&a[m][0] 表示 int *

解决方案二:

作为特例

 a = &a = a[0] = &a[0] = &a[0][0]
a[m] = &a[m] = &a[m][0]

解决方案三:

不管你怎么理解的,以我说的为准。

解决方案四:

你要习惯从C语言的语法约定去推导规则,而不是根据某个程序的值相等不相等去瞎凑。

解决方案五:

你的误解在于 你虽然知道 数组名是首元素的地址,但你忽略了 它是一个指针常量,假设一位数组名 a , a=&a; 同理二维数组也是。

时间: 2024-09-17 03:28:37

指针-关于二维数组a中,a[1] 与 &a[1]相等的一个疑问?(从来没弄懂)的相关文章

二级指针创建二维数组

问题描述 二级指针创建二维数组 1) 编写函数CreateMatrix( int **a,int n, int m),生成一个n行.m列的矩阵,矩阵中的元素由随即函数rand()生成(范围1~99). 解决方案 #include <stdio.h> #include <stdlib.h> #include <time.h> void CreateMatrix( int **a,int n, int m) { int i,j; a = (int**)malloc(n*si

求大神讲解一下指针指向二维数组时该怎么用?

问题描述 求大神讲解一下指针指向二维数组时该怎么用? 指针指向一维数组时只用*(p+n)即可,但是二维数组时候改怎么用呢? 解决方案 个人认为其实二维数组还是一维数组,没有什么区别,例如int a[3][4],就相当于int a[12].要想访问a[2][3],就用*(a+(4*2+3)*(sizeof(int))),应该是这样,不过我一般用a[4*2+3] 来访问对应的元素 本人也是菜鸟,如果有错还请大神们指正~ 解决方案二: 由于指针与数组之间可以若转化,所以在一定程度上可以理解为数组就是指

C语言 指针与二维数组详解_C 语言

二维数组在概念上是二维的,有行和列,但在内存中所有的数组元素都是连续排列的,它们之间没有"缝隙".以下面的二维数组 a 为例: int a[3][4] = { {0, 1, 2, 3}, {4, 5, 6, 7}, {8, 9, 10, 11} }; 从概念上理解,a 的分布像一个矩阵: 0   1   2   3 4   5   6   7 8   9  10  11 但在内存中,a 的分布是一维线性的,整个数组占用一块连续的内存: C语言中的二维数组是按行排列的,也就是先存放 a[

c++的问题-指针和二维数组的用法

问题描述 指针和二维数组的用法 int *s for(i=0;i<5;i++) for(j=0;j<5;j++) cout<<s[i][j];//error想请教各位程序员哥哥这个要怎么改啊? 解决方案 楼上的就行了,int (*s)[5][5] 也可以吧. 解决方案二: 虽然是二维的数组,其实指针的指的是第一行第一列,所以*s[i]就成了一个一维数组的指针,在c++里面你还可以试试引用,同时理解指针. 解决方案三: 首先,s在此处定义为一维,二维引用会导致错误.其次,对于s,没有

《指针的编程艺术(第二版)》一3.2 指针与二维数组

3.2 指针与二维数组 指针的编程艺术(第二版) 一维数组与指针的关系前面已经介绍过.一维数组的元素值,可使用[]或一个*得到,假设有一个数组如下: int i[7] = {0, 1, 2, 3, 4, 5, 6}; int *ptr=i; 则(i+2) 或i[2] 或(ptr+2) 或ptr[2],都表示数组某一个元素的值.而二维数组(two dimension array){XE "二維陣列(two dimension)"},则需要两个,或一个与一个[ ],或两个[ ],才能得到数

指针与二维数组

这是一个大一的学生问我的问题,当时竟然搞糊涂了!!! 1 #include <stdio.h> 2 int main() 3 { 4 char str[ ][10]={"China","Beijing"}; 5 char *p; 6 p = str[0]; 7 printf("%s\n",p+10); 8 while(1); 9 return 0; 10 } 11 /* 12 p输出china 13 p+1输出hina 14 ----

二维数组-C#中如何大幅提高写excel文件的速度?

问题描述 C#中如何大幅提高写excel文件的速度? 输入文件:input.txt包含以[:]号或者[t]制表符分隔的多行(实际在100万行以上)数据,每行数据个数不定. a;b;c 1;2; 1;2;3;4;5 输出文件;output.xlsx a b c 1 2 1 2 3 4 5 问题:写了个小程序处理2000行在10s以内,百万行速度就太慢,无法忍受了.求教一些能显著提高写Excel速度的方法.网上查的先变成二维数组之类的方法,效果不大.百万行在20min以内就好. 解决方案 你完全没有

C语言及程序设计提高例程-35 使用指针操作二维数组

贺老师教学链接  C语言及程序设计提高 本课讲解 使用指向二维数组元素的指针 #include <stdio.h> int main( ) { int a[3][4]= {1,3,5,7,9,11,13,15,17,19,21,23}; int *p; for(p=a[0]; p<a[0]+12; p++) { printf("%3d ",*p); } return 0; } 使用指向一维数组的指针 #include <stdio.h> int main(

java 二维数组-java中把两个维数相同的矩阵对应的元素相加得到新的矩阵的代码

问题描述 java中把两个维数相同的矩阵对应的元素相加得到新的矩阵的代码 java中把两个维数相同的矩阵对应的元素相加得到新的矩阵的代码怎么写,在int[][] add(int[][]a,int[][] b)中添加代码,实现这个功能 解决方案 循环不就行了,和遍历差不多.