首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

初识指针指针指针变量、如何理解地址、指针类型意义、void*指针、野指针、空指针)(笔记)

四、指针类型意义(为什么不用ptr_t p代表所有指针) 1.指针解引用时候有多大权限 (如果一个指针代替所有的话,解引用时字节与变量定义类型不同) 2.指针类型决定了指针向前或向后走一步有多大...:无具体指针(泛型指针) 这种类型指针可以用来接受任意类型地址,但也有局限性, void*类型指针,局限性在于他不能直接进行指针+-整数和解引用运算 有什么用: 一般void*类型指针是使用在函数参数部分...,用来接收不同数据类型地址, 这样可以实现泛型编程效果,使得一个函数来处理多种类型数据 注意: void*类型指针不能直接进行解引用操作 void* 类型指针也不能进行指针计算操作...//pv++;//err void* 类型指针也不能加减一操作 return 0; } 六、野指针: 指针指向位置是不可知(随机,不正确,没有明确限制) 使用完指针后未将其置为NULL...七、空指针指针是一个特殊数据类型,它值定义为NULL。空指针不同于NULL整数表示,它是一个指针变量特殊值,表示该指针变量不指向任何有效内存地址。

7210
您找到你想要的搜索结果了吗?
是的
没有找到

【C 语言】数组 ( 数组指针 | 数组指针定义 | 使用 数组指针类型 定义数组指针 )

// 然后 , 声明一个 数组指针类型 变量 ArrayPointer p = NULL; 一、使用 数组指针类型 定义数组指针 ---- 使用 数组指针类型 定义数组指针 , 首先 , 使用...typedef 定义一个数组指针类型 , typedef int(*ArrayPointer)[3]; 然后 , 定义一个普通数组 , 之后 数组指针 指向该数组 , int array2...[3] = {0}; 最后 , 声明一个 数组指针类型 变量 , 将 array2 变量地址赋值给该 数组指针类型 变量 , 指针指向数据类型为 int[3] 数组类型变量 array2 ;...// 首先 , 定义 数组指针类型 别名 typedef int(*ArrayPointer)[3]; // 然后 , 定义一个普通数组 , 之后 数组指针 指向该数组...int array2[3] = {0}; // 最后 , 声明一个 数组指针类型 变量 // 将 array2 变量地址赋值给该 数组指针类型 变量 // 指针指向数据类型

2.9K10

【C 语言】指针数据类型 ( 指针步长 | 复杂指针阅读技巧 )

文章目录 一、指针步长 二、复杂指针阅读技巧 一、指针步长 ---- 指针 也是一种 数据类型 , 其 类型指针 指向 内存空间 数据类型 ; 指针步长 : 根据 指针 指向 内存空间 数据类型...就在 栈内存 中 , 为其 分配 4 字节数据 ; 使用 : 当在 函数 中 , 使用该指针指向数据时 , 才关心该指针指向数据结构 ; 二、复杂指针阅读技巧 ---- 如果遇到复杂指针类型 ,...int) 类型函数指针, 其指针变量名称写在中间括号中 ; 3.数组指针混合函数指针 : 如果出现了 数组指针 指向一个函数, 这个指针可读性很差, 理解需要一定功力 ; 复杂指针阅读技巧 ( 主要是...int* , 即 int 类型指针类型 ( 3 ) 函数类型 第二个参数是 int (*f)(int*) 也是一个函数类型指针 3....类型, 参数是 int* 指针类型 和 int (*)(int*) 函数指针 类型 指针 f 是一个指向 int(int*) 类型函数指针, 其返回值是 int 类型, 参数是 int* 指针类型

41110

【C 语言】指针数据类型 ( 野指针 | 避免野指针推荐方案 )

文章目录 一、野指针 二、避免野指针推荐方案 一、野指针 ---- 参考 【C 语言】内存管理 ( 动态内存分配 | 栈 | 堆 | 静态存储区 | 内存布局 | 野指针 ) 四....野指针 ( 程序BUG根源 ) 博客章节 ; 野指针产生原因 : 指针变量 指向 内存空间 被释放 , 但是 指针变量 还保存着一个地址值 , 此时不能随便修改该地址值 中数据 ; 指针变量 与 指针指向内存空间数据值...是不同概念 ; 二、避免野指针推荐方案 ---- 避免野指针方法 : 定义指针变量 置空 : 声明 指针变量 时 , 为其设置初始值 NULL ; char *p = NULL; p = (char...*)malloc(10); 释放内存后 指针变量 置空 : 释放 指针变量 指向内存后 , 立刻将指针变量设置为 NULL ; free(p); p = NULL; 只要 声明指针 , 一律给 指针变量...设置 NULL 初始值 ; 只要 释放指针 , 一律将指针变量设置 NULL ; 这样 使用指针 前 , 判断该 指针变量 是否为 NULL , 就可以判断该指针是否是有效指针 ;

22020

【C++】函数重载 ④ ( 函数指针定义三种方式 | 直接定义函数指针 | 通过 函数类型 定义 函数指针 | 通过 函数指针类型 定义 函数指针 )

返回值 不是 " 函数重载 " 判断标准 ; 二义性 : 如果 函数重载 与 默认参数 结合使用 , 出现了二义性 , 编译直接失败 ; 函数指针赋值重载函数 : 根据 函数指针 类型 参数列表类型...); return_type : 函数指针 指向函数 返回值类型 ; func_ptr : 函数指针 名称 , 使用该 名称 也可以调用函数 , 用法与函数名相同 ; parameter_list..., 定义函数指针 , 直接根据指针定义语法 指针类型* 指针名称 定义函数指针 , 同时将 add 函数 地址 赋值给 函数指针 ; // 根据 函数类型 定义 函数指针 func* func1...= add; 3、通过 函数指针类型 定义 函数指针 首先 , 通过 typedef 关键字, 定义 函数指针 类型 , 类型名称为 func_ptr , 对应函数 参数列表是 2 个 int 参数...); 然后 , 通过 func_ptr 函数指针类型 , 定义 函数指针 , 直接使用 变量类型 变量名称 方式定义 函数指针 ; // 根据 函数指针类型 定义 函数指针 func_ptr func2

15430

【C 语言】指针数据类型 ( 指针类型变量 | 使用 * 操作内存 )

文章目录 一、指针类型变量 二、使用 * 操作内存 一、指针类型变量 ---- 指针 也是 变量 , 也占用内存空间 , 可以用于保存 内存地址 ; 测试 指针 变量占用内存空间大小 : 定义一个 int...* 指针类型变量 , 使用 sizeof 函数 获取该变量大小 ; 代码示例 : #include #include int main() { int...a = 8; // 声明指针类型变量 int *p = 888; // 声明二级指针类型变量 int **p2 = 8888; // 打印 变量 a , b...: 声明 指针 时 , * 表示声明变量是指针变量 ; 使用指针 : 使用 指针 时 , * 表示操作 指针 指向 内存空间 数据 ; 操作内存 : *p 相当于 通过 指针地址 ( p 变量值...) 找到对应内存首地址 , 根据数据类型大小操作 这块指定大小 内存 ; 内存赋值 : *p 放在等号左边 , 是给 内存 赋值 ; 内存取值 : *p 放在等号右边 , 是从 内存 取值

58210

【C++】函数重载 ④ ( 函数指针定义三种方式 | 直接定义函数指针 | 通过 函数类型 定义 函数指针 | 通过 函数指针类型 定义 函数指针 )

返回值 不是 " 函数重载 " 判断标准 ; 二义性 : 如果 函数重载 与 默认参数 结合使用 , 出现了二义性 , 编译直接失败 ; 函数指针赋值重载函数 : 根据 函数指针 类型 参数列表类型...); return_type : 函数指针 指向函数 返回值类型 ; func_ptr : 函数指针 名称 , 使用该 名称 也可以调用函数 , 用法与函数名相同 ; parameter_list..., 定义函数指针 , 直接根据指针定义语法 指针类型* 指针名称 定义函数指针 , 同时将 add 函数 地址 赋值给 函数指针 ; // 根据 函数类型 定义 函数指针 func* func1...= add; 3、通过 函数指针类型 定义 函数指针 首先 , 通过 typedef 关键字, 定义 函数指针 类型 , 类型名称为 func_ptr , 对应函数 参数列表是 2 个 int 参数...); 然后 , 通过 func_ptr 函数指针类型 , 定义 函数指针 , 直接使用 变量类型 变量名称 方式定义 函数指针 ; // 根据 函数指针类型 定义 函数指针 func_ptr func2

11230

【C 语言】数组 ( 数组指针 | 数组指针定义 | 使用 数组类型* 定义数组指针 )

文章目录 总结 一、使用 数组类型* 定义数组指针 二、完整代码示例 总结 typedef int(ArrayType)[3]; ArrayType *p = NULL; 一、使用 数组类型...* 定义数组指针 ---- 数组类型指针 就是 定义一个指针 , 指向数组首地址 ; 使用 数组类型* 定义数组指针 , 首先 , 定义数组类型 别名 , typedef int(ArrayType...)[3]; 然后 , 使用别名类型 , 声明数组变量 , ArrayType array2 = {0}; 最后 , 声明一个指针 , 将 array2 变量地址赋值给该指针 , 指针指向数据类型为...int[3] 数组类型变量 array2 ; ArrayType *p = NULL; p = &array2; 验证上述 定义数组指针 : 为 数组元素 赋值 , //...// 最后 , 声明一个指针 , 将 array2 变量地址赋值给该指针 // 指针指向数据类型为 int[3] 数组类型变量 array2 ArrayType *p = NULL;

3.4K20

【C 语言】指针数据类型 ( 指针类型变量 与 指针指向内存块 概念区别 | 指针赋值 | 指针运算 | 内存赋值 | 内存取值 | 内存修改注意事项 )

文章目录 一、指针类型变量 与 指针指向内存块 概念区别 1、指针赋值 2、指针运算 3、内存赋值 4、内存取值 5、内存修改注意事项 一、指针类型变量 与 指针指向内存块 概念区别 ---- 指针类型变量...与 指针指向内存块 概念区别 : 给定一个指针类型变量 : // 定义一个普通整型变量 int a = 888; // 声明 指针类型变量 // 将整型变量地址赋值给指针类型变量 int *p =..., p + 1 与 p++ 计算结果是指针地址值加上指针类型对应字节大小值 , 如果是 int 类型指针 , 则增加 4 字节 ; 3、内存赋值 ** 给指针指向内存赋值 * 给上述指针变量...p 指向内存 进行赋值操作 , 如 *p = 0x7F451D12 , 不会改变指针变量 p 值 , 只会改变指针变量 p 原来指向 内存块 中存储值 ; 4、内存取值 指针指向内存赋值与取值...修改内存注意事项 : 给指针赋值时 , 要 确保指针指向 内存 可以修改 , 全局数据区 中 常量区 值 不能修改 , 代码区 中值不能修改 , 堆区 和 栈区 中值 , 即使能修改 , 也要确保指针是正确

2.9K20

【Android FFMPEG 开发】FFMPEG 方法中指针类型参数说明 ( 一维指针类型参数 | 二维指针类型参数 )

一维指针类型参数 II . 二维指针类型参数 I . 一维指针类型参数 ---- 1 ....) 结构体指针是不能造成影响 , 这种操作无意义 ; ③ 传入一维指针要求 : 这种情况下传入指针必须经过初始化才行 , 在方法中只修改指针指向结构体元素值 ; 3 ....: 对传入 AVPacket *pkt 指针参数地址进行修改没有意义 , 在方法中如果修改了传入指针地址 , 仅仅是将传入副本值改变了 , 之后一系列修改都是针对一个副本值进行 ;...*pkt 参数一维指针 ( 副本值 ) 修改该内存中值 , 那么该内存中值会被改变 , 此时外部指针 AVPacket *avPacket 指针指向内存值也会被改变 ; 5 ....二维指针类型参数 ---- 1 .

40130

【C++】函数指针 ④ ( 函数指针做函数参数 | 使用函数指针间接调用函数 | 函数指针做参数 | 函数指针类型本质 | 函数指针做参数意义 )

, 调用函数可以动态指定 ; 2、函数指针做参数 定义了 如下 函数指针类型 pFun_add , 其类型为 int (*)(int, int) , 该指针指向一个 类型为 int (int, int..., int); 定义函数 接收 pFun_add 类型形参作为参数 , 该类型是 函数指针类型 , 也就是 函数接收一个 函数指针类型参数 , 在该函数中调用 函数指针 指向 函数 ; // 传入函数指针...动态传入 ; 函数指针类型 该用法 是框架基础 , 将 函数执行逻辑 与 软件框架 进行解耦 ; 也就是 将 任务调用者 与 任务实现者 进行了隔离 , 解耦合 ; 下面的示例中 , 可以将 函数指针类型变量...函数名 ( 函数地址 ) 作为 函数指针 参数 // 传递给函数 caculate(add, 11, 12); 3、函数指针类型本质 函数指针类型 本质 : 提前对任务 格式 进行约定 ; 函数参数类型...约定了 函数 参与者 ; 函数返回值类型 约定了 函数 执行结果 ; 只要 将 子任务 按照 上述 " 函数指针类型 " 约定 , 开发出 符合要求 函数 , 就可以将其作为一个 子任务 传递到

20750

CCPP 指针变量 | 数组指针 | 指针数组 | 野指针 | 空指针

普通变量和指针变量 共性 PS: 可见这4个函数汇编指令完全一致,无论是什么类型指针变量,对指针变量读写跟普通变量没有任何区别,所谓指向只是描述指针变量值时多少而已,就读写而言,指针变量跟普通变量没有任何区别...,这样很危险,但如果养成将指针初始化为空指针习惯,我们就能判断出这个指针是不是有效(判断是不是NULL就可以了)通用指针一般都用在函数传参,实现所谓“多态”,但到函数里面使用时,一般还是被转换成具体类型指针...指针变量+-运算 指针变量加减运算:也就是做地址偏移,不同 指针类型偏移步长不同。...*类型实体。...p是一个指针a是一个二维数组,需要用数组指针接收。 详细分析: int *p: p类型是int*一级指针,大小4个字节,p存放是一个整形地址。

1.7K30

CCPP 指针变量 | 数组指针 | 指针数组 | 野指针 | 空指针

普通变量和指针变量 共性 PS: 可见这4个函数汇编指令完全一致,无论是什么类型指针变量,对指针变量读写跟普通变量没有任何区别,所谓指向只是描述指针变量值时多少而已,就读写而言,指针变量跟普通变量没有任何区别...,这样很危险,但如果养成将指针初始化为空指针习惯,我们就能判断出这个指针是不是有效(判断是不是NULL就可以了)通用指针一般都用在函数传参,实现所谓“多态”,但到函数里面使用时,一般还是被转换成具体类型指针...指针变量+-运算 指针变量加减运算:也就是做地址偏移,不同 指针类型偏移步长不同。...指针数组 定义 int *p[n]; []优先级高,先与p结合成为一个数组,再由int*说明这是一个整型指针数组,它有n个指针类型数组元素。...那现在我们清楚p2 是一个指针,它指向一个包含10 个int 类型数据数组,即数组指针

1.6K20

详解c++指针指针指针引用

展示一下使用指针指针指针引用修改传递给方法指针,以便更好使用它。...(这里说指针指针不是一个二维数组) 为什么需要使用它们 当我们把一个指针做为参数传一个方法时,其实是把指针复本传递给了方法,也可以说传递指针指针值传递。...如果我们在方法内部修改指针会出现问题,在方法里做修改只是修改指针copy而不是指针本身,原来指针还保留着原来 值。...输出是两个2 使用指针指针 展示一下使用指针指针做为参数 void func(int **p) { *p = &m_value; // 也可以根据你需求分配内存 *p...我们看一下 func(int **p)这个方法 p:  是一个指针指针,在这里我们不会去对它做修改,否则会丢失这个指针指向指针地址 *p:  是被指向指针,是一个地址。

1.3K60
领券