认识指针
内容来自《深入理解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);