C指针一直没有稳固的掌握,两层就开始晕,希望这次能有所突破。

从读《深入理解C指针》开始

认识指针

星号两边的空白符无关紧要,下面的声明是等价的:

int* pi;
int * pi;
int *pi;
int*pi;

简洁引用操作符(*)返回指针变量指向的值,一般称为解引指针。

地址操作符&会返回操作数的地址。

声明指向函数的指针:

void (*foo)();

size_t
size_t 类型标识C中任何对象所能达到的最大长度。它是无符号整数,因为付好没有意义。用来做sizeof操作符的返回值类型,同时也是很多函数的参数类型,包括malloc和strlen。

在打印size_t类型的时候,要小心,因为它是无符号值,如果选错格式说明符,可能会得到不可靠的结果。推荐使用说明符%zu,或者使用%u%lu

sizeof操作符用来判断指针长度。

printf("Size of *char: %d\n", sizeof(char*));

Size of *char: 4

指针的运算

  1. 给指针加上整数
    给指针加上一个整数实际上加的数是这个整数和指针数据类型对应字节数的乘积。
int vector[] = { 28, 42, 7 };
int *pi = vector;

printf("%d %d\n", *pi, pi);
pi += 1;
printf("%d %d\n", *pi, pi);
pi += 1;
printf("%d %d\n", *pi, pi);

result:
28 3537788
42 3537792
7 3537796
  1. 指针相减
    一个指针减去另一个指针会得到两个地址的差值。这个差值一般没有什么用用,但是可以用来判断数组中元素的顺序。
Contents
  1. 1. 从读《深入理解C指针》开始
    1. 1.1. 认识指针