C语言二维数组指针

作者&投稿:缑满 (若有异议请与网页底部的电邮联系)
B答案是正确的,因为二维数组名相当于二级指针,用二级指针(w)来表示元素的必须有两个(*)号:
A *(*w+3) ()的优先级高于*,所以*w是列指针(一级指针) (*w+3)是列上加3,也就是移到第三列 *(*w+3)就是第一行第三列的元素值
B *(w+1)[4] ()和[]优先级相等,但自左至右结合,[]优先级高于* 所以 w+1 是行指针移到下一行(用q来表示) *q[4] q[4] 是再往下移4行,我定义的数组时3行,所以越界啦,随机值。如果把4改为1就可以表示一个元素啦,即 *(w+1)[1]
C *(*(w+1)) w+1是行指针下移一行 *(w+1) 列指针,再加一个*号,指元素
D *(&w[0][0]+1) &w[0][0]是列指针 &w[0][0]+1是列指针加1,列指针再加*号是指元素

#include<stdio.h>
void main()
{
int w[3][5];
for(int i = 0,k = 1;i < 3;i++)
{
for(int j = 0;j < 5;j++)
{
w[i][j] = k++;
}
}
for(i = 0;i < 3;i++)
{
for(int j = 0;j < 5;j++)
{
printf("%d ",w[i][j]);
}
printf("\n");
}
printf("A: %d\n",*(*w+3));
printf("B: %d\n",*(w+1)[4]);//行越界啦
printf("C: %d\n",*(*(w+1)));
printf("A: %d\n",*(&w[0][0]+1));
printf("B: %d\n",*(w+1)[1]);//这样改就可以啦
}
是否可以解决您的问题?

#include <stdio.h>
int k=7;
void f(int **s)
{ int *t=&k; // t 指向 k *t=7
*s=t; // *s = t **s = *t = 7
printf("%d,%d,%d,", k, *t, **s); // 7 7 7
}
int main()
{ int i=3,*p=&i, **r = &p; // *p = 3 **r= *p = 3;
f(r); // 函数结束后**r = **s = *t =7
printf("%d,%d,%d\n", i, *p, **r);
return 0;
}

问题的关键是主函数中的指针p的值被修改了,因为:
在f(r) 中,r = &p ; 在 f 函数中,*s = t 相当与 p = t;

而 t = &k; 所以 p = &k.

那么主函数中,*p = k; **r = k。

c语言二维数组用指针表示的问题~

ptr=arr;
其实你这样赋值也是可以的,是没有问题的。
因为arr是二维数组的数组名,它(arr)本身就代表这个二维数组的第0行的地址。
问题关键不是出现在这里,而是在你程序的while循环语句中
while(scanf("%f", &ptr+i)&&i!=7)
i++;
你这样写是不对的,首先ptr指向的是一个地址,所以ptr+i也是一个地址,所以这里就不能用变址运算符"&"了。第二个问题是,i 从0自加到6,这里面其实有了7个数,明显超过了arr数组的长度,这样是不对的。这个循环还有一个问题就是,这本身就是一个不正常的循环(自己想想为什么)
下面是我帮你改改的代码,希望对你会有帮助。
#include
void main()
{
double arr[2][3];
double *ptr;
int i=0;
ptr=*arr; //把数组arr第0行第0列的地址赋给ptr,其作用与ptr=arr;相同,
但不建议采用ptr=arr;这样的赋值//
printf("Plese enter 2*3 numbers:
");
for(i=0;i<6;i++)
scanf("%lf",ptr+i); //注意不要将ptr+i 写成&ptr+i 或&(ptr+i),否则出错//
for(i=0;i<6;i++)
printf("%g ",*ptr++);
printf("
");
}

a是指针,不过是行指针,p的基类型int,而 a 的基类型是一个包含4个整形元素的一类数组.
int (*p)[4] = a;这样定义p也会编译过去的,因为这时p的基类型也是一个包含4个整形元素的一类数组。
至于int* p = a[0];编译正确,是因为a[0]也是指针,基类型也是int。

C语言如何定义指针指向字符型二维数组
答:使用指针变量访问二维数组的任意一个元素的方法:1.使用列指针:定义一个列指针p,让它指向二维数组的第0个元素 int a[3][4];int *p;p=&a[0][0];//因为a[0]是第0行的数组名,所以p=&a[0][0]相当于p=a[0],因为a[i][j]前面共有i*4+j个元素 该二维数组的任意i行j列元素可...

C语言二维数组指针变量是什么,int (*p)[2]什么意思
答:类型名 (*数组名)[数组行数][数组列数]如:int (*p)[2][3]; // 定义一个int类型的二维数组指针变量,数组中每个元素都是一个指针int (*p)[2]表示定义一个数组指针,只是是一个一维的数组指针,数组中每个元素(共2个元素)都是一个int类型的指针变量,指针指向的地址就需要后续程序给出,不然会变为野指针。

C语言 指针二维数组怎么初始化
答:1、数组指针初始化方法:int (*p)[4];char a[3][4];p=a;p=&a[0];p=a+1;p=&a[1]; //都正确 p=a[0]; //错误 p=a[1]; //错误。2、首先,指针p表示的是,指向一个含有4个元素的一维数组的指针,因此,必须把一个含有4个元数的数组的地址赋给指针p才会正确。因为二维数组...

c语言中二维数组的指针如何表示
答:int **p;或者 int p[MAX_ROW][MAX_LINE];不同的是前者定义了一个int型二维数组的指针,编写器知道该指针的移动方式以int为单位,但此时该指针为NULL,即没有与内存中的物理单元进行对应。使用指针前需要用malloc()为该指针分配一段内存空间,内存空间的大小在malloc()的参数中指定,系统会为该指针...

C语言里指向二维数组的指针是不是相当于一个二维指针?
答:指向二维数组的 可以是一维指针,可以是一维指针数组,可以是一维数组指针,也可以是二维数组指针。其中,一维指针数组,和一维数组指针这两个,是相当于二维指针,但只是级别上相当,也不能完全等同。

C语言二维数组与指针
答:B答案是正确的,因为二维数组名相当于二级指针,用二级指针(w)来表示元素的必须有两个(*)号:A *(*w+3) ()的优先级高于*,所以*w是列指针(一级指针) (*w+3)是列上加3,也就是移到第三列 *(*w+3)就是第一行第三列的元素值 B *(w+1)[4] ()和[]优先级相等,但自左至右...

C语言:使用指针将二维数组转置
答:1> 二维数组(可以看成一维数组)首尾倒置 2> 使用指针(2个p1,p2),指向一维数组头/尾,然后向尾/向头移动,直到中间位置(p1>=p2)停止移动 char myArray[5][10];char *p1 = &(myArray[0][0]);char *p2 = &(myArray[4][9]);char temp;while (p1 < p2){ temp = *p1;p1 = *...

c语言二维数组的数组指针为什么是(*p)[n]而不是(*p)[m],我觉得c[m...
答:一楼,当然有区别!对于这个问题,必须先理清两个问题。1、指针数组与数组指针的区别。指针数组是以指针为单位的元素集合,而数组指针是指向某数组首地址的单个指针。2、指针的移动规则。指针要移动,必须先知道当前所指内容的大小,进而确定其移动的步长,步长等于其所指内容字节数。综上所述,问题已经很...

C语言:关于二维数组的指针问题, 对于一维数组来说,数组a[i]的数组名...
答:比如a[3][4]是不是代表3个一维数组,一维数组的大小是4 那么第一个数组的数组名是a[0],然后a[0]这个数组里面有四个元素分别为{a[0][0],a[0][1],a[0][2],a[0][3]},第二个数组名是a[1],以此类推 二维数组相当于也是一个数组,里面装的都是一位数组a[3] = {a[0],a[1]...

c语言中,关于指针int(*p)[4]和int*p指向二维数组a[3][4]初始化的问题...
答:p指向一个N列二维数组的首地址 p自增1,p指向下一“行”一维数组的首地址 因为p是一个二级指针。所以索引其指向的数据内容需要取二次内容,格式及解释如下:格式:*(*(p+行)+列)解释:其实很好理解,因为p作为二级指针,p++代表的仅仅是行号+1所以格式中*(p+行)就取到了所在行首地址指针(...