C语言中关于a+1是几维指针的问题。

供稿:hz-xin.com     日期:2025-01-15
C语言中的a+1是几维指针的问题。

哥们,你还在这个问题上纠结呢!
a如果是二维数组,那么a+1还是二维数组,如果是一维数组,那么a+1也是一维数组。像这种基本的加减逻辑运算,其最终运算的结果是不会改变指针的类型的。除非涉及到修改指针类型的运算,如*,&,以及数组的索引器的运算。

二维数组是两层指针,这个你该明白
*(*(a+i)+j)这个是表示i行的第j个数据,注意啊,是两个*
要是不理解,记住套用即可

一个*是指针
所以ij都是指针

a+1是一个指针,表示第1行的首地址(c中数组时从0开始计数的)

在二维数组中,
a,a[0],&a[0][0]这三个指针虽然都是a的首地址的值,但是在c中用起来是不一样的
a表示二维数组的首地址
a[0]表示第0行的首地址
&a[0][0]表示第0行的第0个元素的地址

a是几维的,a+1,a+2....a+i就是几维的,它的相对偏移量是与*a的类型有关。你这个a是二维数组吧,二维数组“相当于”二维指针,那*a就是一维指针,如果是int a[3][5],那么相对偏移就是int [5];

你知道二维指针的意思么:int **a 。 它代表a所掼向的对象是一个一维指针,那它就是二维指针。
指针可以间接寻址的。
比如对二维指针 a可以取**a,也可以取*a;但是对一维指针只能进行一次间接寻址如:对 int *a;只能取*a,不能取**a;他们所指向的空间里面存放的内容不同,我觉得这是最主要的区别吧。
建议楼主去看一下行指针和列指针。。。
虽然a+1是二维指针,因为它指向a[1],而a[1]和a[1][0]的地址相等。但是二者代表含义不同。

a+1的指针类型于他所指向的数组有关,如果指向一维数组,不存在所谓的行指针,那是多维数组里面的概念,如果b[3]={1,2,3}那么a+1就指向2,;
在二维数组里面a[3][3]={1,2,3,4,5,6,7,8,9},a+1的确是行指针,指向第二行,所谓的a[1]是方便理解,其实它里面有三个元素!

这个命题是有问题的,
如果数组a是int型的,那么a[1] 应该是a+sizeof(int)
如果数组a是char型的,a+1 和 a[1]的地址相等

我觉得没必要关心a+1是所谓几维指针
我们知道a是数组的起始地址,即a的值是一个地址,这个地址后的一连串空间用来保存数组的元素。那么a+1就是首地址偏移一个字节
如果数组是int型,则这个地址在第一个元素内部,如果是int型则表示是该数组的第二个元素

整个内存空间可以看做是一个超大的一维数组,其他N维都可以用一维数组来表示,

a+1 与 a的类型一样,a是什么a+1就是什么类型的、维数指针;
当然它值与a不一样

首先你得告诉大家a定义为 int a[3][8]; 此时a可以认为是 (int [8]) * 的类型指针 ;他跟二维指针概念还是有一点点差别的。a+1 也是 (int [8])* 类型指针,没有差别。

不要把值 和类型搞混了。讨论类型的时候不要关心值。

a[1]就是*(a+1),一模一样。[]就是取地址运算符,解析之后就是*()的形式。

a[1]就是&a[1][0]
所以*(a+1)就是&a[1][0],也就是地址

你不要老想着什么取地址取值,只要按照*的运算规律和数组的基本概念去理解就好了
对于一个二维数组,a表示a[0]的首地址即&a[0],而a[0](把a[0]看作一个一维数组)表示a[0][0]的首地址即&a[0][0]。一句话,数组名代表数组第一个元素的地址。
再好好想想吧


C语言中关于a+1是几维指针的问题。
虽然a+1是二维指针,因为它指向a[1],而a[1]和a[1][0]的地址相等。但是二者代表含义不同。

C语言中的a+1是几维指针的问题。
a如果是二维数组,那么a+1还是二维数组,如果是一维数组,那么a+1也是一维数组。像这种基本的加减逻辑运算,其最终运算的结果是不会改变指针的类型的。除非涉及到修改指针类型的运算,如*,&,以及数组的索引器的运算。

数组指针问题? p不是指向a的指针吗 为什么p跟a相等
没错,数组里面,数组名,数组名的地址,和首元素的地址都是相同的,不管是几维,都有这个规律。虽然地址相同,但是指针不同,访问的方式也不同。如上面,p和a的值虽然相同,但是p增加1,就相当于跨越了一个5个int的数组。而a增加1,只是跨越一个int。也就是说 p+n=a+5*n ...

为什么二维数组a[i] 和&a[i]相等
在内存中二维数组是一行一行存储的,即本例中4个4个的存储。那么数组的开头,即可以是数组第一个元素的位置,可以是数组的首地址,也可以是第一行的首地址。如图 即a[0][0] 是二维数组的第一个元素,也是第 0 行的第一个元素,他们的位置是一样的所以地址也必然是相同的。a = a[0] = &a...

(*p)[2]二维数组?
p是一个指针,这个指针指向的是3个一组整数的数据区,当p=a的赋值完成后,p指向a数组的第1组数据即a[0][0],a[0][1],a[0][2],则(*p)[0]就是p[0][0]就是a[0][0],那么(*p)[2]就是p[0][2]就是a[0][2];如果写(*(p+1))[2]则是p[1][2]也是a[1][2]...

呵呵,问一个C语言中二维数组的问题。
几维可以考虑理解为矩阵。a[2][3]是一个二行三列的矩阵。这个是数据的“形状”。“字符”数组是指这数组中的数据是“字符”这种数据“类型”。类型和形状讲的2回事。当然了,实际上a[x][y]中指的有这么一个数组a[x],x中y个元素。如果按矩阵来理解则 |[0][0],[0][1],[0][2]| a[...

对于一个二维数组a[3][3]
cout << " &a+1 = " << &a+1 << endl << endl;\/\/偏移了整个二维数组a[3][3]字节的量\/***\/ cout << " a = " << a << endl; cout << " *a+1 = " << *a+1 << endl; cout << " a+1 = " ...

C++关于函数返回值为二维数组的问题,请高手来帮个忙,谢了
int **a(){} \/\/这里int **表示指向一个指针数组,那么自然就要开辟一个指针数组,而不是一个二维数组。那么函数体内需要定义指针int **p=new int *[n];然后再为每一个指针开辟一位数组。最后返回。对于二维数组参数:void a(int **a)这里int **声明a是指向指针数组的,那么怎么可以传给他...

2维数组*a与a与&a为什么相同啊!
无论是几维数组,在内存中都是线形存储的;你可以把二维数组堪称五个一维数组的排列,a[0]是第一行的手地址,一次类推。。。那么&a就是第一个数组的手地址,a是整个二维数组的手地址,刚才不是说了,而维数组的手地址也就是第一个一维数组的手地址,*a是一个指针,当然先要指向数组的首地址阿...

数组a=(1,4,-5)是几维数组?
根据你给出的数据,数组 a 是一维数组。一维数组是最简单的数组类型,它由一个连续的内存块组成,并用一个下标来引用数组中的每一个元素。例如,在数组 a 中,a[0] 表示第一个元素 (1),a[1] 表示第二个元素 (4),以此类推。数组 a 的声明可以写成这样:int a[3] = {1, 4, -5};...