指向指针的指针和二维数组名等同吗?

本文详细解析了C语言中指针与数组混合运算的原理,包括数组名作为指针的使用、数组作为指针变量的情况以及它们之间的区别。通过实例演示了如何正确地进行指针与数组的结合操作,并强调了数组名与指针变量的不同性质。

////////////////////////////////////QUESTION/////////////////////////////////////////////////

如int a[2][3]; int **b; b=a;为什么不能这样赋值。
还有如int *p[3];其中平p[0],p[1]等不都是指针吗,
那我可以把p理解成指向指针的指针吗。

问题补充:

#include <iostream>
using namespace std;
int main()
{
 int j,i;
 int *p[2],a[3]={4,5,6};
 p[0]=new int[3];
 p[0][0]=1;
 p[0][1]=2;
 p[0][2]=3;
 p[1]=a;
 for(i=0;i<2;i++)
 for(j=0;j<3;j++)
 //printf("%d",*(*(p+i)+j));
 printf("%d",p[i][j]);
    
    return 0;

}
这个程序呢。
说int *p[]和int **p
里的p都是指向指针的指针
但是这个程序如果有*p替换p[]为什么会出错
还有就是,这个程序里的p最后不是也可以当成二维数组名吗
http://zhidao.baidu.com/question/151492993.html
 
//////////////////////////////////REPLY//////////////////

int a[2][3]; a的类型相当于 int (*)[3]而不是int **

 

int a[2][3];

int (*b)[3] = a; 这是可以的

 

---

 

int *p[3];

 

数组类型变量参与运算的时候视为指针。运算时的p[0],这里[]是指针的运算符,数组类型不会直接参与运算。 p[0]就是 *(p + 0) 也就是*p 显然p可以看成int **类型的

 

---

 

只有运算的时候 int *[]才是int **,声明的时候int *p[3]和int **p是不一样的。int **p是一个指针的空间,里面存的数据是int **,int *q[3]是3个指针空间里面存的数据是int *。

 

p用的时候是直接使用它保存的数据,q在用的时候使用的是声明的变量的首地址,因为那个地址保存的数据是int *所以地址的类型也就是int **。

 

p: |(int **)|

q: |(int *)|(int *)|(int *)|

 

数组在运算时候转意为指针,但是数组变量本身不等于指针。p你可以用int **赋值,但是q不可以,因为q转意得到的int **并不是保存在变量里的。

 
//////////////////////////////////////////////////////////////////////////////////

int **p;这是指向指针的指针,表示指针变量p应指向一个指针的地址,注意一定要是指针的地址才不会出错,比如

 int a=1; int *p1=&a; int **p=&p1;不能是int **p=&a;因为变量a不是指针,同理

对二维数组a[2][3]的数组名

这里要注意,这里的数组名并不是一个简单的指针,二维数组的数组名是一个指向一维数组的指针,也就是数组名a是一个指向包含有三个元素的一维数组的指针,即(*)[3];因此不可以把数组名赋给指向指针的指针**p,应该把二维数组名赋给int (*p)[3]这样的指针,这样的指针表示的就是一个指向包含有3个元素的一个数组的指针。

 

对于数组名不是一个简单的问题,比如一维数组名a[3]那么数组名a表示的是指向第一个元素的指针,但&a却表示的是指向一个含有3个元素的一维数组的指针,具体问题的研究,请去本人的文库下载相应文章吧

 

简单给你解释下

p是数组,每一个数组元素都是指针,因此*p[1]表示的是指针p[1]所指向地址的值,而p[1]表示的是指针p[1]所指向的地址,因此*p[1]和p[1]是不相同的。现在我们来看数组名p,数组名p表示的地址是&p[0],也就是指针p[0]的地址。

 

要记住无论是多少维的数组,他的数组名都表示的是&a[0]的地址。

具体的内容请下载本人文章《C指针与数组的混合运算》里面有讲解

### C语言中二维数组是否为指针的解释 在C语言中,**二维数组并不是一个普通的指针**。它是一个指向数组的常量指针,表示整个数组的首地址。当使用二维数组时,其行为类似于一个指向一维数组的指针。具体来说,二维数组可以被解释为指向该数组第一个子数组的地址[^1]。 例如,定义一个二维数组 `int arr[3][4];` 后,`arr` 表示的是整个二维数组的地址,而 `arr + n` 则表示第 `(n+1)` 个子数组的地址[^4]。这意味着,`arr` 并不是一个普通的指针变量,而是一个不可修改的常量地址,指向二维数组的第一个子数组。 #### 指针与二维数组的关系 - **普通指针**:如果定义了一个普通指针 `int *p;`,那么它可以指向单个整数或一维数组中的某个元素。 - **一维数组指针**:如果定义了一个指针 `int (*p1)[4];`,那么它可以指向一个包含 4 个整数的一维数组,即二维数组中的某一行[^3]。 - **二维数组指针**:如果定义了一个指针 `int (*p2)[3][4];`,那么它可以指向一个完整的二维数组。 通过这些定义可以看出,二维数组本身并不等同于普通指针,但它可以被用来初始化指向一维数组的指针或指向整个二维数组的指针。 #### 示例代码 以下代码展示了如何使用二维数组相关指针: ```c #include <stdio.h> int main() { int arr[3][4] = { {0, 1, 2, 3}, {4, 5, 6, 7}, {8, 9, 10, 11} }; // 二维数组作为常量地址 printf("Address of arr: %p\n", (void *)arr); printf("Address of first sub-array: %p\n", (void *)arr[0]); printf("Address of second sub-array: %p\n", (void *)(arr + 1)); // 使用一维数组指针 int (*ptr1)[4] = arr; printf("Value at arr[0][0]: %d\n", (*ptr1)[0]); // 使用二维数组指针 int (*ptr2)[3][4] = &arr; printf("Value at arr[1][2]: %d\n", (*(ptr2))[1][2]); return 0; } ``` #### 关键点总结 - 二维数组是一个常量地址,不能被修改。 - 它可以被用来初始化指向一维数组的指针或指向整个二维数组的指针。 - 二维数组的行为类似于指向第一个子数组的指针,但本质上不是普通的指针变量[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值