认识指针
内容来自《深入理解C指针》
声明指针
 在数据类型后面跟上星号*,如下的声明都是等价的
int* pi;
int * pi;
int *pi;
int*pi;
阅读声明
 如下:
const int *pci;
1.
pci是一个变量 const int *pci;
2.pci是一个指针变量 const int*pci;
3.pci是一个指向整数的指针变量 constint *pci;
4.pci是一个指向整数常量的指针变量const int *pci;
地址操作符
 地址操作符&会返回操作数的地址
int num;
int *pi = #
打印指针的值
int num = 0;
int *pi = #
printf("Address of num: %p Value: %d\n", &num, num);
printf("Address of pi: %p Value: %p\n", &pi, pi);
输出可能如下:
Address of num: 0x7ffeefbff51c Value: 0
Address of pi: 0x7ffeefbff510 Value: 0x7ffeefbff51c
在不同的平台上用一致的方式显示指针的值比较困难。一种方法是把指针转换为void指针,然后使用%p格式说明符来显示:
printf("Value of pi: %p\n", (void *)pi);
间接引用操作符
 间接引用操作符(*)返回指针变量指向的值

 NULL
 NULL被赋值给指针就意味着指针不指向任何东西
 NULL宏是强制类型转换为void指针的整数常量0,在很多库中的定义如下:
#define NULL ((void *)0)
测试指针是否设置为NULL。如果pi被赋值为NULL值,那就会被解释为二进制0
pi = NULL;
if (pi) {
    printf("pi is null\n");
} else {
    printf("pi is not null\n");
}
或者
if (pi == NULL) {}
if (pi != NULL) {}
void指针
void指针是通用指针,用来存放任何数据类型的引用
void *pv;
任何指针都可以被赋给void指针,它可以被转换回原来的指针类型,指针的值和原指针的值是相等的
int num = 100;
int *pi = #
printf("Value of pi: %p\n", pi);
void *pv = pi;
pi = (int *)pv;
printf("Value of pi: %p\n", pi);
输出如下,显示指针地址是一样的:
Value of pi: 0x7ffeefbff51c
Value of pi: 0x7ffeefbff51c
void指针只能用做数据指针,而不能用做函数指针
sizeof操作符可以用在void指针上
size_t size = sizeof(void *);
size_t 是用来表示长度的数据类型
全局和静态指针
指针被声明为全局或静态,就会在程序启动时被初始化为NULL
int *globalpi;
void foo() {
    static int *staticpi;
}
int main(int argc, const char * argv[]) {
    
    return 0;
}

 size_t
size_t类型表示C中任何对象所能达到的最大长度。是无符号整型,负数在这里没有意义
 size_t用做sizeof操作符的返回值类型,同时也是很多函数的参数类型,如malloc和strlen
 size_t的典型定义如下:
 
size_t推荐的格式说明符是%zu
size_t sizet = 5;
printf("%d\n", sizet);
printf("%zu\n", sizet);



















