[关闭]
@Xiaojun-Jin 2015-03-29T13:37:41.000000Z 字数 1983 阅读 1052

Pointer Keynotes

C Pointer


  1. int a; //一个整型数
  2. int *a; //一个指向整型数的指针
  3. int **a; //一个指向指针的指针, 它指向的指针是指向一个整型数
  4. int a[10]; //一个有10个整型数的数组
  5. int *a[10]; //一个有10个指针的数组, 该指针是指向一个整型数的
  6. int (*a)[10]; //一个指向有10个整型数数组的指针
  7. int (*a)(int); //一个指向函数的指针, 该函数有一个整型参数并返回一个整型数
  8. int (*a[10])(int); //一个有10个指针的数组, 该指针指向一个函数, 该函数有一个整型参数并返回一个整型数

[] and () have higher precedence over *. Since [] and () with higher precedence are written to the right of the variable, when reading complex declarator, you always start from the identifier and go right as long as possible then go left when you reach either the end of the declarator or a closing parenthesis.

int *a(int): 返回指针的函数,返回值是int*类型的
e.g.

int *b(int x) {}; int *(*a)(int) = b;
or
int b(int x) {}; int (*a)(int) = b; //先定义了函数b, 然后a指向b

int a(int)中a代表函数的地址, 不是变量, 是函数的名字, 值不可变。而int (*a)(int)中a是一个指针, 变量, 能随意指向任何一个类型一致的函数。

int *i = 5; // wrong: a指向地址值为5的地方(非法未知的address)
int *a = 5; (星号意味着指针类型) not equal to *a = 5; (星号意味着取内容)
前者是a的值为5, 后者是a指向的变量的值为5.

commonly-used: int b; int *a = &b;
int b = 5; int *a = &b; *a = 6; //value of b is 6 now
a这个指针必须指向一个分配了地址的地方, 否则就有非法访问的危险, 除了int *a = 0;是安全的, 其他常量一般不安全

int *a = 0; 0是默认的空指针, 就是NULL
指针的使用必须是这样子: int b = 5; int *a = &b;
or:
int *a = (int *)malloc(sizeof(int)); then *a = 5;

int (*a[10])(int): 指针数组, 这些指针是指向函数的指针, e.g.

  1. int (*a[10])(int);
  2. int fun(int x) {return x*x;}
  3. a[10] = fun;
  4. printf("%d\n", a[0](5));

定义指针数组int *a[10], 每个指针指向一块10个int大小的内存, 赋值0-99, 并打印:

  1. int *a[10] = {NULL};
  2. int i, j, k = 0;
  3. for (i = 0; i < 10; i++) //让数组每个元素都指向一个10个int大小的空间
  4. a[i] = (int *)malloc(sizeof(int)*10);
  5. for (i = 0; i < 10; i++) //赋值
  6. for (j = 0; j < 10; j++)
  7. a[i][j] = k++;
  8. for (i = 0; i < 10; i++) //打印数据
  9. {
  10. for (j = 0; j < 10; j++)
  11. printf("%2d", a[i][j]);
  12. printf("\n");
  13. }
  14. for (i = 0; i < 10; i++) //release
  15. free(a[i]);

Alternatively:

  1. int *a[10]; int num = 0;
  2. for (int i = 0; i < 10; i++)
  3. {
  4. a[i] = (int *)malloc(10*sizeof(int));
  5. for (j = 0; j < 10; j++)
  6. *(a[i] + j) = num++;
  7. }
  8. for (i = 0; i < 10; i++)
  9. {
  10. for (j = 0; j < 10; j++)
  11. printf("%2d", *(a[i] + j));
  12. printf("\n");
  13. }
  14. for (i = 0; i < 10; i++)
  15. free(a[i]);
  16. system("pause");
  17. return 0;

Difference between int *a(int) and int (*a)(int):
第一个是指针函数(a不是指针, 是函数), 第二个是函数指针(指针函数是个函数, 函数指针是个指针)。

指针函数是返回值为指针的函数, 函数指针是指向函数的指针。指针函数其实就是普通的函数, 只是返回值是个指针而已。

int *a(int) is equal to (int *)a(int)
a先跟谁结合, a就是谁, 优先跟括号结合

int (*a)(int) and int a(int)
一个是指针一个是函数: 前者a跟星号结合, 那就是指针; 后者a先跟后面的括号结合, 那就是函数。

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注