1. 一种专门装地址的变量

    11.1 指针变量

  2. 每一个字节对应唯一的地址,有时候一个变量占有多个字节,第一个字节的地址被称为该变量的地址

image.png
如图,该变量 i 占有第 2000 和第 2001 两个字节,其中第 2000 字节是变量的地址。

  1. 指针就是地址,指针变量存储地址

11.1.1~11.1.2 取地址符和间接寻址符

  1. &:取地址符:获取地址的
  2. *:间接寻址符:获取该地址对应存储空间的内容(值,对象)
  1. #include <stdio.h>
  2. // int *p; 是声明一个指针变量,也就是给这个变量开辟一个存储空间
  3. // (int *)p
  4. // *p; 是取 p 这个指针的值
  5. // p; 存储的就是地址,和 &x 一样
  6. int main()
  7. {
  8. int x = 10;
  9. int *p = &x;
  10. printf("x 的地址:%d(用取地址符表示),\nx 的地址:%d(用指针表示),\nx 的值(对象):%d\n",&x,p,*p);
  11. printf("说明 &x 等价于 p");
  12. }
  13. // 输出
  14. x 的地址:6684180(用取地址符表示),
  15. x 的地址:6684180(用指针表示),
  16. x 的值(对象):10
  17. 说明 &x 等价于 p

你可以把 * 和 & 理解为两个互逆的操作

  1. #include <stdio.h>
  2. int main()
  3. {
  4. int i=10;
  5. int p = *&i;
  6. printf("%d",p);
  7. }
  8. // 输出
  9. 10

改变指针的值,也会改变指针所指对象的值

  1. #include <stdio.h>
  2. int main()
  3. {
  4. int i=10;
  5. int *p = &i;
  6. *p = 11;
  7. printf("*p = %d,i = %d",*p,i);
  8. }
  9. // 输出
  10. *p = 11,i = 11

11.3 指针赋值

前提是两个指针具有相同的类型
image.png

  1. #include <stdio.h>
  2. int main()
  3. {
  4. int i = 10;
  5. int *p = &i;
  6. int *q;
  7. q = p;
  8. printf("i = %d\n *p = %d\n *q = %d\n",i,*p,*q);
  9. }
  10. // 输出
  11. i = 10
  12. *p = 10
  13. *q = 10

note

  1. p = q 和 p = q 是不同的

11.4 指针作为实际参数

C 语言中的参数传递

  1. 值传递(变量传递):传递的是副本,即在子函数中对变量的修改,不影响主函数中的变量的值
  2. 地址传递:传递的是实际的变量地址,一处改动,处处变化

先来看用变量作为参数传递

  1. #include <stdio.h>
  2. void changeNumber(int i);
  3. int main()
  4. {
  5. int i;
  6. i=10;
  7. changeNumber(i);
  8. printf("在主函数中的 i =%d\n",i);
  9. return 0;
  10. }
  11. void changeNumber(int i)
  12. {
  13. i = i+1;
  14. printf("在子函数里面的 i = %d\n",i);
  15. }
  16. // 输出
  17. 在子函数里面的 i = 11
  18. 在主函数中的 i =10

地址传递

  1. #include <stdio.h>
  2. void changeNumber(int *i);
  3. int main()
  4. {
  5. int i;
  6. i=10;
  7. changeNumber(&i);
  8. printf("在主函数中的 i =%d\n",i);
  9. return 0;
  10. }
  11. void changeNumber(int *i)
  12. {
  13. *i = *i+1;
  14. printf("在子函数里面的 i = %d\n",*i);
  15. }
  16. // 输出
  17. 在子函数里面的 i = 11
  18. 在主函数中的 i =11

11.5 指针作为返回值

  1. #include <stdio.h>
  2. int *comMax(int *p,int *q);
  3. int main()
  4. {
  5. int i = 10;
  6. int j = 20;
  7. int *p = &i;
  8. int *q = &j;
  9. int *ans = comMax(p,q);
  10. printf("最大值的地址:%d,最大值是:%d",ans,*ans);
  11. return 0;
  12. }
  13. int *comMax(int *p,int *q)
  14. {
  15. if(*p>*q)
  16. return p;
  17. else if(*p<*q)
  18. return q;
  19. }
  20. // 输出
  21. 最大值的地址:6684160,最大值是:20