目录
1.字符指针
int main()
{
const char* pstr = "hello world.";
printf("%s\n", pstr);
return 0;
}
pstr中存放的就是字符串的首元素地址,并不是把字符串hello world 放到字符指针pstr中了。
2.指针数组
指针数组是一个存放指针的数组
cpp
1 int* arr1[10];
2 char *arr2[4];
3 char **arr3[5];
第一行代码表示整形指针的数组
第二行代码表示一级字符指针的数组
第三行代码表示二级字符指针的数组
3.数组指针
cpp
int (*p)[10]
p先和*结合,说明p是一个指针变量,然后指着指向的是一个大小为10个整型的数组。所以p是一个指针,指
向一个数组,叫数组指针。
注意:[ ]的优先级要高于*号的,所以必须加上()来保证p先和*结合。
4.数组传参
cpp
#include <stdio.h>
int main()
{
int arr[10] = { 0 };
printf("arr = %p\n", arr);
printf("&arr= %p\n", &arr);
printf("arr+1 = %p\n", arr+1);
printf("&arr+1= %p\n", &arr+1);
return 0;
}
根据上面的代码我们发现,其实&arr和arr,虽然值是一样的,但是意义应该不一样的。
实际上: &arr 表示的是数组的地址,而不是数组首元素的地址。(细细体会一下)
本例中 &arr 的类型是: int(*)[10] ,是一种数组指针类型
数组的地址+1,跳过整个数组的大小,所以 &arr+1 相对于 &arr 的差值是40.
5.函数指针
cpp
void test()
{
printf("hehe\n");
}
//下面pfun1和pfun2哪个有能力存放test函数的地址?
void (*pfun1)();
void *pfun2();
首先,能给存储地址,就要求pfun1或者pfun2是指针,那哪个是指针? 答案是:
pfun1可以存放。pfun1先和*结合,说明pfun1是指针,指针指向的是一个函数,指向的函数无参数,返回值类型为void。