ubuntu,debian,redhat,fedora,centos
« »
2010-02-26C/C++

257

C语言中几种指针的指针用法

1、 简单来说 int **p 是一个指向2维数组的指针。
数学上一个2维数组描述有NR行,NC列的矩阵,例如 int a[NR][NC];
为了使程序有通用性,编程时不把这个数组行列数定死,而让使用者临时输入行列数,再动态分配数组存放单元,这时,我们声明一个2维数组的指针(或叫二重指针)。

  1. int NR,NC;
  2. int **a;
  3. int i,j;
  4.  
  5. // 假定键盘输入 NR=5,NC=3,动态分配数组:
  6. a = (int **) malloc(sizeof(int *) * NR);
  7. for (j=0;j<NR;j++) a[j] = (int *) malloc(sizeof(int) * NC);

  1. // 现在可以直接用 a[j][i] 作运算,不用管 数组元素的地址。
  2. // 例如:
  3. for (j=0;j<NR;j++) for (i=0;i<NC;i++) { 
  4. a[j][i] = (j+1)*100 + i;
  5. };
  6.  
  7. for (j=0;j<NR;j++){ 
  8. for (i=0;i<NC;i++) printf("%3d ",a[j][i]);
  9. printf("\n");
  10. };

int **a; 是声明。 **a 是什么呢? 打出来看:
printf(“%d “,**a); //它是 a[0][0] 数组单元的值。

二重指针指向的地址除了始地址外,比较复杂,它同malloc的方法有关。上面的malloc是传统方法,也有人用连续方法。可以用打印a[j][i]和指针的值和地址自己研究。
[用a[j][i]写法,是为了与数学一致,i->x轴,j->y轴]

2、 只是二重指针,用来存放指针的指针。

  1. int** p
  2. int a[20][20];
  3. p=a; //这是将二维数组赋给了p,我们可以这样调用a的值*(*(a+i)+j)
  4. int** p
  5. int *a[20];
  6. p=&a; //这是将指针的地址赋给了p,而p代表a[0]的地址,p+1代表a[1]的地址。

3、 二重指针,即指向指针的指针变量
指针变量中储存的是它指向的对象的地址,指针的指针指向的是存放该指针变量值的地址

  1. int **p ;    //指向一个地址, 这个地址指向一个int 类型的变量的地址,假设分配的地址是连续的.
  2. int a = 100;*b;**c;
  3. b = &a;
  4. c = &b;
  5. p = c;

地址 内容 表现形式
[1000] [100 ] a,**c,*b
[1004] [1000] b,*p,&a
[1008] [1004] p,&b

4、 指针就是用来存放内存地址的,
int*p存储的是int型数据的地址,
int **p 当然就是存储的int型指针的地址。

二级指针可以用来传参

  1. >void func(char **ptr) 
  2. { 
  3. *ptr = NULL;
  4. } 
  5. int main() { 
  6. char a = 'a';
  7. char *ptr = &a;
  8. func(&ptr);
  9. } 
  10. //这样就把ptr的值更改了。

void func(char *ptr) 只能改变指针指向的内容。

您还可能感兴趣的内容

日志信息 »

该日志于2010-02-26 23:47由 admin 发表在C/C++分类下, 你可以发表评论。除了可以将这个日志以保留源地址及作者的情况下引用到你的网站或博客,还可以通过RSS 2.0订阅这个日志的所有评论。

没有评论

发表评论 »

返回顶部