c基础学习 - 指针

来源:互联网 发布:ubuntu java安装在哪好 编辑:程序博客网 时间:2024/05/22 09:07
1. 基础
int i = 10;int *p = &i; /* 定义一个指向int类型的指针p,并把i的地址赋给它 */printf("i=%d, &i=%p, p=%p, *p=%d \n", i, &i, p, *p);

程序输出为:
i=10, &i=0x22ac44, p=0x22ac44, *p=10

&i是i的地址,指针p保存了i的地址,*p是取指针的值,也就是i的值。

2. 指针类型的参数和返回值

/* 定义一个返回值为指向int类型的指针的函数 */int *swap(int *px, int *py){int temp;temp = *px;*px = *py;*py = temp;return px;}int main(void){int i = 10;int j = 20;int *m = swap(&i, &j);printf("i=%d, j=%d, *m=%d \n", i, j, *m);return 0;}

程序输出为:
i=20, j=10, *m=20

return px相当于定义了一个int类型的临时指针来保存px,然后再把这个指针赋给指针m,所以m的指向和px是一样的。

3. 指针和数组

int a[5] = {1, 2, 3, 4, 5};int *pa = &a[0];printf("*pa=%d pa=%p a=%p \n", *pa, pa, a);pa++;printf("*pa=%d \n", *pa);

程序输出为:
*pa=1 pa=0x22ac28 a=0x22ac28
*pa=2
  1. 数组名作为参数传递时,实际传递的是第一个元素的指针,从上面的输入可以看出。
  2. 指针pa++是让pa指向下一个元素。

4. 指针与const

int n = 30;const int *x = &n;int const *y = &n;printf("*x=%d y++=%p \n", *x, y++);

程序输出:
*x=30 y++=0x22ac1c

const int 和 int const是一样的,都是定义一个指向const int类型的指针。所以*x是不可变的,不能执行(*x)++这样的操作,但是x是可变的,可以执行x++的操作。

int * const z = &n;printf("++(*z)=%d \n", ++(*z));

程序输出:
++(*z)=31

上面定义的是一个指向int类型的const指针,所以z是不可变的,但是指针的值是可变的。要定义都不可变的指针就是:
int const * const pz;

5. 指向指针的指针

int c = 40;int *pc = &c;int **ppc = &pc;printf("&pc=%p ppc=%p *ppc=%p **ppc=%d", &pc, ppc, *ppc, **ppc);

程序输出:
&pc=0x22ac0c ppc=0x22ac0c *ppc=0x22ac10 **ppc=40

*ppc取的是pc的值,而**ppc就相当于*pc,就是c的值。
原创粉丝点击