本文主要讲解指针的使用。
指针环节:
- 指针变量存储的值都是些地址。
tip:当你直接往一地址处写入数据时,需要先强制转换,比如地址0xF000FF00,因为它是一个字面值常量,类型为整形,需要先转换为指针类型:
unsigned char *p = (unsigned char *)0xF000FF00;
*p=11;
或者直接写成 * (unsigned char *)0xF000FF00 = 11;
- 用sizeof 求指针变量类型的大小,可以知道机器是32bit还是64bit的。
- 指针变量可以作为左值,并不因为它们是指针,而是因为它们也是变量。指针变量的类型为指针类型,所以作为左值时,等号右边的结果也理应是指针类型。《c和指针》6.7节有个例子:
int a;
int *p = &a;
*p = 10 - *p; //正确
p = 10 - *p; //错误,因为它表示把一个整形数值(10-*p)存储于指针变量中
- 指针常量:pointer to const . 指向常量的指针变量。指针变量可修改,指向的对象不可修改。口头上指针常量说的比较多,方便大家使用,记住就行了,而常量指针用的少,可忽略。
- NULL指针:一个特殊的指针变量,其并未指向任何东西。
- void * :标准规定一个void *指针可以转换为其它任何类型的指针。老式的编译器可能需要你强制转换,比如:
int *ptr = (int *)malloc(100); //old compiler, 100 bytes allocated.
int *ptr = malloc(100); //new compiler
因为void * 特别灵活,所以在内存操作函数中用的非常多(malloc、memset、memcpy等等)。
- 函数指针