深入理解指针const修饰指针const:表示被修饰的变量具有常量属性const就是常量的意思1当我们创建一个变量例如变量a,创建后我们可以通过二次赋值改变它的值。如图所示但我们使用const修饰它的一个变量的时候这个变量就具有了常量属性在C语言中常量不可修改如图所示1.2const 修饰指针变量首先在切入正题前我们必须理解上面是*p和p。*p:表示的是指针指向的值p表示指针的指向、const 类型* 变量名const在最左边的时候表示修饰指针所指向的值不可改变所修饰的内容但是可以改变指针变量的指向。如图所示图中const修饰了指针变量int* p所指向的值使其具有常量属性常量属性 常量所以不可以修改。但是我们依然可以修改它的指向。如图所示、类型* const 变量名const在右边的时候表示修饰指针变量的指向不可改变指针的指向但是可以改变指针变量所指向的内容。如图所示因为const修饰的是指针变量的指向所以已经不可改变但可以改变其指向的内容如图所示3、const 类型* const 变量名顾名思义const既修饰了指针变量指向的内容也修饰了指针变量的指向都不可以修改。如图所示野指针概念 野指针就是指针指向的位置是不可知的随机的、不正确的、没有明确限制的如图所示在创建局部变量时如果局部变量的值未初始化则值将会是随机的全局变量未初始化则默认为0同理指针变量未初始化则值将会是随机的具有不确定性和高风险性不安全性。2.1野指针成因2.1.1、未初始化2.1.2、越界访问2.1.3、指针指向的空间释放在test()函数中局部变量n,在出函数时被销毁故变为野指针assert断⾔assert.h头⽂件定义了宏assert()⽤于在运⾏时确保程序符合指定条件如果不符合就报 错终⽌运⾏。这个宏常常被称为“断⾔”。assert(p !NULL);1上⾯代码在程序运⾏到这⼀⾏语句时验证变量p是否等于NULL。如果确实不等于NULL程序 继续运⾏否则就会终⽌运⾏并且给出报错信息提⽰。assert()宏接受⼀个表达式作为参数。如果该表达式为真返回值⾮零assert()不会产⽣任何作⽤程序继续运⾏。如果该表达式为假返回值为零assert()就会报错在标准错误流stderr中写⼊⼀条错误信息显⽰没有通过的表达式以及包含这个表达式的⽂件名和⾏号。assert()的使⽤对程序员是⾮常友好的使⽤assert()有⼏个好处它不仅能⾃动标识⽂件和出问题的⾏号还有⼀种⽆需更改代码就能开启或关闭assert()的机制。如果已经确认程序没有问题不需要再做断⾔就在#include assert.h语句的前⾯定义⼀个宏NDEBUG。4.指针的使⽤和传址调⽤传值调用函数会创建一个新的空间形参的改变不会影响到实参。我们发现在main函数内部创建了a和ba的地址是0x008b01b9f754b的地址是0x008b01b9f744在调⽤ Swap函数时将a和b传递给了Swap1函数在Swap1函数内部创建了形参x和y接收a和b的值但是 x的地址是0x00cffcecy的地址是0x00cffcf0x和y确实接收到了a和b的值不过x的地址和a的地址不 ⼀样y的地址和b的地址不⼀样相当于x和y是独⽴的空间那么在Swap1函数内部交换x和y的值 ⾃然不会影响a和b当Swap函数调⽤结束后回到main函数a和b的没法交换。Swap函数在使⽤ 的时候是把变量本⾝直接传递给了函数这种调⽤函数的⽅式我们之前在函数的时候就知道了这种叫传值调⽤。结论实参传递给形参的时候形参会单独创建⼀份临时空间来接收实参对形参的修改不影响实参。 所以Swap是失败的了。我们现在要解决的就是当调⽤Swap函数的时候Swap函数内部操作的就是main函数中的a和b直接 将a和b的值交换了。那么就可以使⽤指针了在main函数中将a和b的地址传递给Swap函数Swap 函数⾥边通过地址间接的操作main函数中的a和b并达到交换的效果就好了。我们可以看到实现成Swap的⽅式顺利完成了任务这⾥调⽤Swap2函数的时候是将变量的地址传递给了函数这种函数调⽤⽅式叫传址调⽤。传址调⽤可以让函数和主调函数之间建⽴真正的联系在函数内部可以修改主调函数中的变量所以未来函数中只是需要主调函数中的变量值来实现计算就可以采⽤传值调⽤。如果函数内部要修改 主调函数中的变量的值就需要传址调⽤。
指针(一)
发布时间:2026/5/23 1:29:10
深入理解指针const修饰指针const:表示被修饰的变量具有常量属性const就是常量的意思1当我们创建一个变量例如变量a,创建后我们可以通过二次赋值改变它的值。如图所示但我们使用const修饰它的一个变量的时候这个变量就具有了常量属性在C语言中常量不可修改如图所示1.2const 修饰指针变量首先在切入正题前我们必须理解上面是*p和p。*p:表示的是指针指向的值p表示指针的指向、const 类型* 变量名const在最左边的时候表示修饰指针所指向的值不可改变所修饰的内容但是可以改变指针变量的指向。如图所示图中const修饰了指针变量int* p所指向的值使其具有常量属性常量属性 常量所以不可以修改。但是我们依然可以修改它的指向。如图所示、类型* const 变量名const在右边的时候表示修饰指针变量的指向不可改变指针的指向但是可以改变指针变量所指向的内容。如图所示因为const修饰的是指针变量的指向所以已经不可改变但可以改变其指向的内容如图所示3、const 类型* const 变量名顾名思义const既修饰了指针变量指向的内容也修饰了指针变量的指向都不可以修改。如图所示野指针概念 野指针就是指针指向的位置是不可知的随机的、不正确的、没有明确限制的如图所示在创建局部变量时如果局部变量的值未初始化则值将会是随机的全局变量未初始化则默认为0同理指针变量未初始化则值将会是随机的具有不确定性和高风险性不安全性。2.1野指针成因2.1.1、未初始化2.1.2、越界访问2.1.3、指针指向的空间释放在test()函数中局部变量n,在出函数时被销毁故变为野指针assert断⾔assert.h头⽂件定义了宏assert()⽤于在运⾏时确保程序符合指定条件如果不符合就报 错终⽌运⾏。这个宏常常被称为“断⾔”。assert(p !NULL);1上⾯代码在程序运⾏到这⼀⾏语句时验证变量p是否等于NULL。如果确实不等于NULL程序 继续运⾏否则就会终⽌运⾏并且给出报错信息提⽰。assert()宏接受⼀个表达式作为参数。如果该表达式为真返回值⾮零assert()不会产⽣任何作⽤程序继续运⾏。如果该表达式为假返回值为零assert()就会报错在标准错误流stderr中写⼊⼀条错误信息显⽰没有通过的表达式以及包含这个表达式的⽂件名和⾏号。assert()的使⽤对程序员是⾮常友好的使⽤assert()有⼏个好处它不仅能⾃动标识⽂件和出问题的⾏号还有⼀种⽆需更改代码就能开启或关闭assert()的机制。如果已经确认程序没有问题不需要再做断⾔就在#include assert.h语句的前⾯定义⼀个宏NDEBUG。4.指针的使⽤和传址调⽤传值调用函数会创建一个新的空间形参的改变不会影响到实参。我们发现在main函数内部创建了a和ba的地址是0x008b01b9f754b的地址是0x008b01b9f744在调⽤ Swap函数时将a和b传递给了Swap1函数在Swap1函数内部创建了形参x和y接收a和b的值但是 x的地址是0x00cffcecy的地址是0x00cffcf0x和y确实接收到了a和b的值不过x的地址和a的地址不 ⼀样y的地址和b的地址不⼀样相当于x和y是独⽴的空间那么在Swap1函数内部交换x和y的值 ⾃然不会影响a和b当Swap函数调⽤结束后回到main函数a和b的没法交换。Swap函数在使⽤ 的时候是把变量本⾝直接传递给了函数这种调⽤函数的⽅式我们之前在函数的时候就知道了这种叫传值调⽤。结论实参传递给形参的时候形参会单独创建⼀份临时空间来接收实参对形参的修改不影响实参。 所以Swap是失败的了。我们现在要解决的就是当调⽤Swap函数的时候Swap函数内部操作的就是main函数中的a和b直接 将a和b的值交换了。那么就可以使⽤指针了在main函数中将a和b的地址传递给Swap函数Swap 函数⾥边通过地址间接的操作main函数中的a和b并达到交换的效果就好了。我们可以看到实现成Swap的⽅式顺利完成了任务这⾥调⽤Swap2函数的时候是将变量的地址传递给了函数这种函数调⽤⽅式叫传址调⽤。传址调⽤可以让函数和主调函数之间建⽴真正的联系在函数内部可以修改主调函数中的变量所以未来函数中只是需要主调函数中的变量值来实现计算就可以采⽤传值调⽤。如果函数内部要修改 主调函数中的变量的值就需要传址调⽤。