c语言指针进阶

c语言指针进阶

  1. 字符指针
    (1)字符指针是用来字符变量的地址
    (2)字符指针的使用:
    第一种
    char ch = ‘o’;
    char* p = &ch;
    第二种:
    char* p = “ahsdj”;

补充:字符串常量是无数名的字符数组,是一个特殊的字符数组。
将一个字符串常量赋个一个字符指针,是将字符串常量的首元素地址赋个字符指针。常量不储存在栈区

这里有个面试题:
c语言指针进阶_第1张图片
c语言指针进阶_第2张图片
这里str3和str4指向的是一个同一个常量字符串。C/C++会把常量字符串存储到单独的一个内存区域,当
几个指针。指向同一个字符串的时候,他们实际会指向同一块内存。但是用相同的常量字符串去初始化
不同的数组的时候就会开辟出不同的内存块。所以str1和str2不同,str3和str4不同。

  1. 指针数组
    (1) 指针数组:用来从存放指针的,即每一个元素都是一个指针
    c语言指针进阶_第3张图片
  2. 数组指针
    (1) 数组指针是一个指针
    (2) 数组指针是一个指向数组的指针
    (3)首先先理解数组类型、数组名和&数组名的含义
    1…数组类型
    我们在创建数组类型的时候,都是 元素类型+数组名+[长度],
    数组类型就是在创建数组的时候将数组名去掉的剩余部分
    例如:int arr[10]----->数组类型:int [10]
    char arr[5]------>数组类型: char [5]
    2…数组名和&数组名
    (1)数组名是一个常量,数组名是不能被修改的
    例如:
    char arr[21];
    arr = arr+1;
    这是一个错误的代码
    (2)我们在 使用数组名的时候,除了在sizeof(数组名)的情况下,数组名是表示整个数组,在其他的情况下,数组名表示数组首元素的地址
    (3)每一个字节都有自己的地址,但是,我们在&(取地址)的时候,所取出来的是最小的地址
    (4)数组在内存开辟空间的时候,是一次性开辟出所需要的空间,在从低地址开始分配空间,所以,首元素的地址在数组中是最小的
    (5)数组名和&数组名表示的都是地址并且数值都是一样的,但是,数组名不等于(!=)&数组名,因为,他们的指针类型不同,(解引用)时 和加减(+ -)整数时,访问的步长不同,
    c语言指针进阶_第4张图片
    3…数组指针的定义和使用
    (1)指针在定义的时候:指向元素的类型+
    +指针变量名
    数组指针的定义也是一样的:数组类型++指针变量名
    只不过
    变量名要有括号()括起来夹在数组类型的中间
    例如:int arr[10];
    int (*p)[10] = &arr;
    (2)*数组指针—>相当于所指向数组的数组名,然后,我们再用操作数组名的方式进行操作,来访问数组元素
    c语言指针进阶_第5张图片
    c语言指针进阶_第6张图片
    c语言指针进阶_第7张图片
    3.数组传参
    (1)一维数组传参
    本质传的是指针,形参可以用数组的形式来接收,也可以用相应的指针来接收
    (2)二维数组传参
    本质传的是指针,形参可以用数组的形式来接收,也可以用相应的指针来接收
    需要注意的是:二维数组每一个元素是一个一维数组,所以,在一指针来接收的时候,要有数组指针来接收

4.函数指针
(1)我们在定义完一个函数后,函数也有自己的地址
(2)函数名和&函数名的理解
函数跟数组不同函数名和&(取地址)函数名是一样的,都是表示函数的地址,即 函数名=&函数名
(3)函数类型的理解
我们在定义函数的时候,返回类型+函数名(类型 形参变量,…)
函数类型:返回类型 (类型 形参变量,…)形参变量可以不写
(4)函数指针的定义和使用
1…函数指针的定义:函数类型++指针变量名
即 返回类型 (指针变量名)(类型 形参变量,…)形参变量可以不写
例如:
int (p)()= test;
2…函数指针的使用
函数指针的使用 进行函数的调用
:函数指针(实参)—>解引用(
)可写可不写
由此,我们可以知道,我们在使用函数指针的时候 解引用操作符(
)只是摆设 ,使用多个
都没问题,不使用也行c语言指针进阶_第8张图片
由此,我们可以知道,我们在使用函数指针的时候 解引用操作符()只是摆设 ,使用多个都没问题,不使用也行c语言指针进阶_第9张图片
5.函数指针数组
(1)每一个元素是一个函数指针类型
(2)函数指针类型+数组名+[长度]
例如:int (*p[5])(int,int)
(3)函数指针数组的使用———————— 转移表

c语言指针进阶_第10张图片
6. 指向函数指针数组的指针
(1) 指向函数指针数组的指针是一个 指针
指针指向一个 数组 ,数组的元素都是 函数指针
例如:
int(p[2])(int,int) = {add,ji};
int(
(*pp)[2])(int,int) = &p;

  1. 回调函数
    (1)回调函数就是一个通过函数指针调用的函数。如果你把函数的指针(地址)作为参数传递给另一个
    函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数。回调函数不是由该函数
    的实现方直接调用,而是在特定的事件或条件发生时由另外的一方调用的,用于对该事件或条件进
    行响应。
    (2)回调函数的使用---->qsort函数
    qsort函数是一个排序函数(使用于任意类型)
    c语言指针进阶_第11张图片
    qsort函数的使用
    c语言指针进阶_第12张图片
    模拟qsort函数
    c语言指针进阶_第13张图片

你可能感兴趣的:(笔记,c语言)