1. 通过 &变量 可以获取变量地址:
#include <stdio.h> int main(void) { int num = 10; printf("变量值: %d\n", num); printf("变量址: %d\n", &num); getchar(); return 0; }
2. 表示变量地址的变量就是指针:
#include <stdio.h> int main(void) { int num = 10; int *p = # printf("%d, %p\n", num, p); getchar(); return 0; }
3. *指针 就如同变量本身是一样的:
#include <stdio.h> int main(void) { int num = 10; int *p = # printf("%d, %p, %d\n", num, p, *p); *p = 11; printf("%d, %p, %d\n", num, p, *p); (*p)++; printf("%d, %p, %d\n", num, p, *p); num = 99; printf("%d, %p, %d\n", num, p, *p); getchar(); return 0; }
4. 声明指针时要注意初始化, 没有初始化的指针是危险的:
#include <stdio.h> int main(void) { int n1 = 11; int n2 = 22; int *p = NULL; /* 初始化为空 */ p = &n1; printf("%d, %p, %d\n", n1, p, *p); p = &n2; printf("%d, %p, %d\n", n2, p, *p); getchar(); return 0; }
5. 为什么没有初始化的指针是危险的:
#include <stdio.h> int main(void) { int *p; // 上面的指针 p 没有初始化话, 但它也有个垃圾地址 printf("%p\n", p); // 此时如果给它赋值, 谁知道会覆盖了什么? //*p = 100; /* 不要执行这个 */ getchar(); return 0; }
6. 指向常量的指针: 不能通过指针修改它指向的值, 但该值可以通过其变量修改
#include <stdio.h> int main(void) { int n1 = 111; int n2 = 222; const int *p = &n1; /* 注意 const 的使用 */ printf("%d, %p, %d\n", n1, p, *p); n1 = 333; //*p = 333; /* 不可以这样, 因为现在的指针是常量 */ printf("%d, %p, %d\n", n1, p, *p); p = &n2; /* 可以改变指针的指向 */ printf("%d, %p, %d\n", n2, p, *p); getchar(); return 0; }
7. 常量指针: 锁定指针的指向
#include <stdio.h> int main(void) { int n1 = 111; int n2 = 222; int *const p = &n1; /* 注意 const 的使用 */ printf("%d, %p, %d\n", n1, p, *p); n1 = 333; //*p = 333; /* 不可以这样, 因为现在的指针是常量 */ printf("%d, %p, %d\n", n1, p, *p); // p = &n2; /* 现在不可以改变指针的指向了 */ // printf("%d, %p, %d\n", n2, p, *p); getchar(); return 0; }
8. 指针是有类型的:
#include <stdio.h> int main(void) { long n = 100L; float f = 1.5f; double d = 3.14159265; long *p1 = &n; float *p2 = &f; double *p3 = &d; printf("%ld\n", *p1); printf("%g\n", *p2); printf("%.8f\n",*p3); getchar(); return 0; }
9. 令人迷惑的指针定义:
到底应该怎样写:
int *p;
int * p;
int* p;
因为 C 语言忽略空白, 这些都是对的, 但下面的例子会说明哪个更好:
#include <stdio.h> int main(void) { int n1, n2, *p; /* 定义了两个整数(n1、n2), 和一个整数指针(p) */ n1 = 111; n2 = 222; p = &n1; printf("%d, %p\n", *p, p); p = &n2; printf("%d, %p\n", *p, p); getchar(); return 0; }