一、指针的基本知识
1.指针是变量,用来存放地址
2.指针大小与类型无关,大小固定是4/8字节(32位/64位平台)
3.指针也有类型,他的类型决定了他的步长
4.指针可以做加减运算
二、字符指针 char* ;
同样可以存在 整形指针int*、结构体指针、数组指针、函数指针等等。
1.char* str ="abcdef"; char* 指向的是a的地址,"abcdef"是字符串常量。
2 char str1[] = "hello bit.";
char str2[] = "hello bit."; (str1 ==str2)? 不相等 str1与str2相比的是首元素地址
const char *str3 = "hello bit.";
const char *str4 = "hello bit."; (str3 ==str4)? 相等 str3与str4都是相同字符串常理,在内存中位置一样
二、指针数组 存放指针的数组
例: char *p[9]; 数组中有九个元素,每个元素的类型是指针。
三、数组指针
指向整形的指针叫整形指针,指向字符的叫字符指针,使用数组指针一定是指向数组的。
*的优先级低于[] ,所以*p要用括号,来保证*先与p结合。
例:int(*p)[9]; 指针p指向数组元素有9个,类型为int的数组。
四、&数组名与数组名
可见数组名和&数组名打印的地址是一样的,但是它们的意思大不相同
&arr 表示的是数组的地址,而不是数组首元素的地址。
&arr的地址+1,跳过整个数组的大小,所以 &arr+1 相对于 &arr 的差值是40.
补充一下:只有&arr,与sizeof(arr)的情况下arr表示的是数组的地址,其他情况下都是数组首元素地址。
五、指针传参
1.一维数组传参
void test(int arr[])//ok?
{}可以
void test(int arr[10])//ok?
{}可以
void test(int *arr)//ok?
{}可以
void test2(int *arr[20])//ok?
{}可以
void test2(int **arr)//ok?
{}可以,arr2是指针数组,int*就是一级指针用int**二级指针来存储
int main()
{
int arr[10] = {0};
int *arr2[20] = {0};
test(arr);
test2(arr2);
}
2.二维数组传参
void test(int arr[3][5])//ok?
{}//可以,二维数组的传参用二维数组接收
void test(int arr[][])//ok?
{}//不可以,二维数组的传参需要指定列数,行可以省略,列不行
void test(int arr[][5])//ok?
{}//可以,二维数组的传参需要指定列数
void test(int *arr)//ok?
{}//不可以,
void test(int* arr[5])//ok?
{}不可以
void test(int (*arr)[5])//ok?
{}可以,数组指针,指向数组的指针
void test(int **arr)//ok?
{}不可以,
int main()
{
int arr[3][5] = {0};
test(arr);
}
六、函数指针
1.函数名即是函数的地址或者&函数名同样也是函数地址,二者意思一致
2.例:指针就是函数指针,我们定义函数要带明他的函数参数,返回值而且还要注意*与谁优先结合
3.两个有趣的代码
(* (void (*)() )0 )();
它是函数调用,一个将地址0,强制类型转化为函数指针类型为void(*)(),并且调用这个参数为空的函数。
void ( *signal(int ,void(*)(int) )(int);
它是一个函数声明,因为它没有结构体!!!
在分析一下,它是以signal为函数名,它有俩个参数,一个是int类型,一个是函数指针,该函数指针的返回值是void类型,参数是int类型,signal的返回类型是函数指针,该指针指向的函数的参数是int类型返回类型是int类型。
八、函数指针数组
把函数的地址存到一个数组中,那这个数组就叫函数指针数组。
我在之后会专门写一个关于函数指针数组用法的博客
例:prr是一个包含4个int(*)(int)类型的函数指针数组
九、指向函数指针数组的指针
十、回调函数
回调函数就是一个通过函数指针调用的函数。如果你把函数的指针(地址)作为参数传递给另一个
函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数。回调函数不是由该函数
的实现方直接调用,而是在特定的事件或条件发生时由另外的一方调用的,用于对该事件或条件进
行响应。
在这里我也先转发一下概念,后面会专门记录一篇关于回调函数和函数指针数组用法的博客。最后我在最近会在先写一个关于指针的练习题,欢迎大家来观看,总结,评论。
到这里就算结束了,欢迎大家评论补充。