关于c语言二维数组问题

时间:2021-02-09 01:00:11
char p[3][4];
p[3][4]={{1,2,2,3},{9,3,4,5},{3,4,5,2}};
所以数组名*p为一个指针,指向数组中的"1",我想让指针向后移一个元素指向第一行的第二个元素"2",我就写了*p++或p[0]++,编译通不过去呢?指针可以做自加操作啊,请大家告诉我还有什么方法可以把指针向后移除了再定义一个指针指向这个数组,直接操作数组名的方法

15 个解决方案

#1


是p为一个指针 不是*p

#2


数组名不是指针变量,所以是不能直接进行自加的

#3


char p[3][4] = {{1,2,2,3},{9,3,4,5},{3,4,5,2}};

#4


p确实是个指针,它指向这个三行四列数组的第一行,p++指向第二行,我想让指针指向第一行第二个元素,*p就是指针,你可以printf("%d",*p)试一试

#5


感觉你对指针的概念很模糊。

#6


p是一个常量,怎么能进行自增运算呢

可以写成*(*(p+i)+j)来进行访问

#7


引用 2 楼 lhcwjy 的回复:
数组名不是指针变量,所以是不能直接进行自加的


对,就是这样的,谢谢你提醒我,数组名是常量,存放在常量区是不可以加的,C++中研究过,忘了,呵呵,但是怎么才能实现向后移呢,只能再定义指针吗

#8


char p[3][4] = {{1,2,2,3},{9,3,4,5},{3,4,5,2}};
printf("%d\n" , *(*p + 1));

#9


我知道是这样可以访问,我只是想通过指针的移动来改变数组的内容,这个该怎么实现呢

#10



char p[3][4]={{1,2,2,3},{9,3,4,5},{3,4,5,2}};
char *p1=p[0];
p1++;

#11


p是数组名,存放数组的首地址 ,可以定义一个指针ptr  把数组的首地址给指针,然后操作。
int b;
char*ptr;
ptr=p;
b=*(++ptr);
 
b的值现在就是2.也就是第一行,第二个数。

#12


p是一个常量,不能进行自增运算
另外定义个指针指向该数组就行了吧

#13


指针可以做自加操作,但P在这里是数组名而不是指针,为何不直接p[0][1]?

#14


C语言程序设计:现代方法(第2版) 


12.3 用数组名作为指针

指针的算术运算是数组和指针之间相互关联的一种方法,但这不是两者之间唯一的联系。下面是另一种关键的关系:可以用数组的名字作为指向数组第一个元素的指针。这种关系简化了指针的算术运算,而且使数组和指针更加通用。

例如,假设用如下形式声明a:

int a[10];

用a作为指向数组第一个元素的指针,可以修改a[0]:

*a = 7;  /* stores 7 in a[0] */

可以通过指针a + 1来修改a[1]:

*(a+1) = 12;  /* store 12 in a[1] */

通常情况下,a + i等同于&a[i](两者都表示指向数组a中元素i的指针),并且*(a+i)等价于a[i](两者都表示元素i本身)。换句话说,可以把数组的取下标操作看成是指针算术运算的一种形式。

数组名可以用作指针这一事实使得编写遍历数组的循环更加容易。思考下面这个来自12.2节的循环:

for (p = &a[0]; p < &a[N]; p++)

  sum += *p;

为了简化这个循环,可以用a替换&a[0],同时用a + N替换&a[N]:

[惯用法]  for (p = a; p < a + N; p++)

           sum += *p;


 虽然可以把数组名用作指针,但是不能给数组名赋新的值。试图使数组名指向其他地方是错误的:

while (*a != 0)

  a++;             /*** WRONG ***/

这一限制不会对我们造成什么损失:我们可以把a复制给一个指针变量,然后改变该指针变量:

p = a;

while (*p != 0)

  p++;
 

#15


你对数组定义好像给弄错了,数组不可以先定义再赋值,必须在定义时就要赋值

#1


是p为一个指针 不是*p

#2


数组名不是指针变量,所以是不能直接进行自加的

#3


char p[3][4] = {{1,2,2,3},{9,3,4,5},{3,4,5,2}};

#4


p确实是个指针,它指向这个三行四列数组的第一行,p++指向第二行,我想让指针指向第一行第二个元素,*p就是指针,你可以printf("%d",*p)试一试

#5


感觉你对指针的概念很模糊。

#6


p是一个常量,怎么能进行自增运算呢

可以写成*(*(p+i)+j)来进行访问

#7


引用 2 楼 lhcwjy 的回复:
数组名不是指针变量,所以是不能直接进行自加的


对,就是这样的,谢谢你提醒我,数组名是常量,存放在常量区是不可以加的,C++中研究过,忘了,呵呵,但是怎么才能实现向后移呢,只能再定义指针吗

#8


char p[3][4] = {{1,2,2,3},{9,3,4,5},{3,4,5,2}};
printf("%d\n" , *(*p + 1));

#9


我知道是这样可以访问,我只是想通过指针的移动来改变数组的内容,这个该怎么实现呢

#10



char p[3][4]={{1,2,2,3},{9,3,4,5},{3,4,5,2}};
char *p1=p[0];
p1++;

#11


p是数组名,存放数组的首地址 ,可以定义一个指针ptr  把数组的首地址给指针,然后操作。
int b;
char*ptr;
ptr=p;
b=*(++ptr);
 
b的值现在就是2.也就是第一行,第二个数。

#12


p是一个常量,不能进行自增运算
另外定义个指针指向该数组就行了吧

#13


指针可以做自加操作,但P在这里是数组名而不是指针,为何不直接p[0][1]?

#14


C语言程序设计:现代方法(第2版) 


12.3 用数组名作为指针

指针的算术运算是数组和指针之间相互关联的一种方法,但这不是两者之间唯一的联系。下面是另一种关键的关系:可以用数组的名字作为指向数组第一个元素的指针。这种关系简化了指针的算术运算,而且使数组和指针更加通用。

例如,假设用如下形式声明a:

int a[10];

用a作为指向数组第一个元素的指针,可以修改a[0]:

*a = 7;  /* stores 7 in a[0] */

可以通过指针a + 1来修改a[1]:

*(a+1) = 12;  /* store 12 in a[1] */

通常情况下,a + i等同于&a[i](两者都表示指向数组a中元素i的指针),并且*(a+i)等价于a[i](两者都表示元素i本身)。换句话说,可以把数组的取下标操作看成是指针算术运算的一种形式。

数组名可以用作指针这一事实使得编写遍历数组的循环更加容易。思考下面这个来自12.2节的循环:

for (p = &a[0]; p < &a[N]; p++)

  sum += *p;

为了简化这个循环,可以用a替换&a[0],同时用a + N替换&a[N]:

[惯用法]  for (p = a; p < a + N; p++)

           sum += *p;


 虽然可以把数组名用作指针,但是不能给数组名赋新的值。试图使数组名指向其他地方是错误的:

while (*a != 0)

  a++;             /*** WRONG ***/

这一限制不会对我们造成什么损失:我们可以把a复制给一个指针变量,然后改变该指针变量:

p = a;

while (*p != 0)

  p++;
 

#15


你对数组定义好像给弄错了,数组不可以先定义再赋值,必须在定义时就要赋值