C语言进阶——指针(1)

一、指针的基本知识

1.指针是变量,用来存放地址

2.指针大小与类型无关,大小固定是4/8字节(32位/64位平台)

3.指针也有类型,他的类型决定了他的步长

4.指针可以做加减运算

二、字符指针 char* ;

同样可以存在 整形指针int*、结构体指针、数组指针、函数指针等等。

例:C语言进阶——指针(1)_第1张图片

 

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]; 数组中有九个元素,每个元素的类型是指针。

C语言进阶——指针(1)_第2张图片

 

三、数组指针

指向整形的指针叫整形指针,指向字符的叫字符指针,使用数组指针一定是指向数组的。

*的优先级低于[] ,所以*p要用括号,来保证*先与p结合。

例:int(*p)[9]; 指针p指向数组元素有9个,类型为int的数组。C语言进阶——指针(1)_第3张图片

 

四、&数组名与数组名

 

可见数组名和&数组名打印的地址是一样的,但是它们的意思大不相同

&arr 表示的是数组的地址,而不是数组首元素的地址。

&arr的地址+1,跳过整个数组的大小,所以 &arr+1 相对于 &arr 的差值是40.

C语言进阶——指针(1)_第4张图片

补充一下:只有&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.例:指针就是函数指针,我们定义函数要带明他的函数参数,返回值而且还要注意*与谁优先结合

C语言进阶——指针(1)_第5张图片

 

3.两个有趣的代码

(* (void (*)() )0 )();

它是函数调用,一个将地址0,强制类型转化为函数指针类型为void(*)(),并且调用这个参数为空的函数。

void ( *signal(int ,void(*)(int) )(int);

它是一个函数声明,因为它没有结构体!!!

在分析一下,它是以signal为函数名,它有俩个参数,一个是int类型,一个是函数指针,该函数指针的返回值是void类型,参数是int类型,signal的返回类型是函数指针,该指针指向的函数的参数是int类型返回类型是int类型。

八、函数指针数组

把函数的地址存到一个数组中,那这个数组就叫函数指针数组。

我在之后会专门写一个关于函数指针数组用法的博客

例:prr是一个包含4个int(*)(int)类型的函数指针数组C语言进阶——指针(1)_第6张图片

 

九、指向函数指针数组的指针

顾名思义,指向函数指针数组的指针。嘿嘿,指针。C语言进阶——指针(1)_第7张图片

 

十、回调函数

回调函数就是一个通过函数指针调用的函数。如果你把函数的指针(地址)作为参数传递给另一个

函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数。回调函数不是由该函数

的实现方直接调用,而是在特定的事件或条件发生时由另外的一方调用的,用于对该事件或条件进

行响应。

在这里我也先转发一下概念,后面会专门记录一篇关于回调函数和函数指针数组用法的博客。最后我在最近会在先写一个关于指针的练习题,欢迎大家来观看,总结,评论。

到这里就算结束了,欢迎大家评论补充。

你可能感兴趣的:(C语言,c语言,开发语言,后端)