c中指针的指针

xiaoxiao2026-06-05  15

c中指针的指针 悬赏分:30 - 解决时间:2007-8-15 12:03 int** p 这是什么意思呢,我知道 int*p=&a 是指向int a的一个指针,定义名字为p,存储的是a的地址,p+1的话,执行后为a的地址加sizeof(int), 那int **p 是什么呢 举个具体例子,包括 地址 还有在其上的运算 1、 简单来说 int **p 是一个指向2维数组的指针。 数学上一个2维数组描述有NR行,NC列的矩阵,例如 int a[NR][NC]; 为了使程序有通用性,编程时不把这个数组行列数定死,而让使用者临时输入行列数,再动态分配数组存放单元,这时,我们声明一个2维数组的指针(或叫二重指针)。int **a; int NR,NC; int **a; int i,j; // 假定键盘输入 NR=5,NC=3,动态分配数组: a = (int **) malloc(sizeof(int *) * NR); for (j=0;j<NR;j++) a[j] = (int *) malloc(sizeof(int) * NC); // 现在可以直接用 a[j][i] 作运算,不用管 数组元素的地址。 // 例如: for (j=0;j<NR;j++) for (i=0;i<NC;i++) { a[j][i] = (j+1)*100 + i; }; for (j=0;j<NR;j++){ for (i=0;i<NC;i++) printf("%3d ",a[j][i]); printf("\n"); }; int **a; 是声明。 **a 是什么呢? 打出来看: printf("%d ",**a); // 噢,它是 a[0][0] 数组单元的值。 二重指针指向的地址除了始地址外,比较复杂,它同malloc的方法有关。上面的malloc是传统方法,也有人用连续方法。你可以用打印a[j][i]和指针的值和地址自己研究。 [我用a[j][i]写法,是为了与数学一致,i->x轴,j->y轴] 2、 只是二重指针,用来存放指针的指针。 int** p; int a[20][20]; p=a;这是将二维数组赋给了p,我们可以这样调用a的值*(*(a+i)+j) int** p; int *a[20]; p=&a;这是将指针的地址赋给了p,而p代表a[0]的地址,p+1代表a[1]的地址。 3、 二重指针,即指向指针的指针变量 指针变量中储存的是它指向的对象的地址,指针的指针指向的是存放该指针变量值的地址 int **p ; 指向一个地址, 这个地址指向一个int 类型的变量的地址 假设分配的地址是连续的. int a = 100;*b;**c; b = &a; c = &b; p = c; 地址 内容 表现形式 [1000] [100 ] a,**c,*b [1004] [1000] b,*p,&a [1008] [1004] p,&b 4、 指针就是用来存放内存地址的, int*p存储的是int型数据的地址, int **p 当然就是存储的int型指针的地址。 二级指针可以用来传参 void func(char **ptr) { *ptr = NULL; } int main() { char a = 'a'; char *ptr = &a; func(&ptr); } 这样就把ptr的值更改了。 void func(char *ptr) 只能改变指针指向的内容。
转载请注明原文地址: https://www.6miu.com/read-5049668.html

最新回复(0)