-
【指针】
指针就是单独的(或者说新的)数据类型,暂时不要把它跟任何东西关联。
指针是如何定义的呢?
char* x = 1; short* y = 1; int* z = 1;
像定义普通变量的时候一样,在类型名称后面加上一个*号即可定义指针类型。
-
取地址符:&
-
解引用/取值符:*
例1:int x = 1; int* y = &x; *y = 2;
将变量(x)的地址赋值给了指针(y),那么此时指针(y)存储的内容就是变量(x)的地址。
如果使用解引用/取值符(*)去操作指针(y),并将其赋值,那么实际操作的就是变量(x)中存储的内容。
例2:
int* x = 123; *x = 456;
如果使用解引用/取值符(*)去操作指针(x),当编译并运行时会出现错误,因为123这个内存地址是不存在的。
-
【指针数组】
指针数组就是存放相同类型指针的数组。
当数组的元素都是相同类型的指针,则称这个数组为指针数组。
指针数组是如何定义的呢?
char* x[5] = { 1, 2, 3, 4, 5 };
for (int i = 0; i < 5; i++)
printf("%p\n", x[i]);
-
【数组指针】
数组指针就是指向数组的指针。
数组指针是如何定义的呢?
int main()
{
char arr[2] = { 0x31, 0x32 }; //0x31 = "1" 0x32 = "2"
char(*x)[2];
short(*y)[2][2];
int(*z)[2][2][2];
x = (char(*)[2])&arr;
printf("x[1]:%c x[2]:%c\n", x[0][0], x[0][1]);
return 0;
}
/*
输出结果:
x[1]:1 x[2]:2
*/
int main()
{
char arr[2] = { 0x31, 0x32 }; //0x31 = "1" 0x32 = "2"
char(*x)[2];
short(*y)[2][2];
int(*z)[2][2][2];
x = (char(*)[2])&arr;
printf("x[1]:%c x[2]:%c\n", *x[0], *(x[0] + 1));
return 0;
}
/*
输出结果:
x[1]:1 x[2]:2
*/
仔细观察,有没有发现数组指针x[0]、(x[0] + 1)和数组x[0][0]、x[0][1]的联系呢?