const指针的两种形式

const 指针与指向const的指针

当使用带有const的指针时其实有两种意思。一种指的是你不能修改指针本身的内容,另一种指的是你不能修改指针指向的内容。听起来有点混淆一会放个例子上来就明白了。

      先说指向const的指针,它的意思是指针指向的内容是不能被修改的。它有两种写法。

      const int* p; (推荐)

      int const* p;

      第一种可以理解为,p是一个指针,它指向的内容是const int 类型。p本身不用初始化它可以指向任何标示符,但它指向的内容是不能被改变的。

      第二种很容易被理解成是p是一个指向 int的const指针(指针本身不能被修改),但这样理解是错误的,它也是表示的是指向const的指针(指针指向的内容是不能被修改的),它跟第一种表达的是一个意思。为了避免混淆推荐大家用第一种。

      再说const指针,它的意思是指针本身的值是不能被修改的。它只有一种写法

      int* const p=一个地址; (因为指针本身的值是不能被修改的所以它必须被初始化)

      这种形式可以被理解为,p是一个指针,这个指针是指向 int 的const指针。它指向的值是可以被改变的如*p=3;

      还有一种情况是这个指针本身和它指向的内容都是不能被改变的,请往下看。

      const int* const p=一个地址;

      int const* const p=一个地址;

      看了上面的内容是不是有点晕,没关系,你不用去背它,用的多了就知道了,还有个技巧,通过上面的观察我们不难总结出一点规律,是什么呢?也许你已经看出来了,什么!竟然没看也来,那只好还得听我唠叨了。这个规律就是: 指向const的指针(指针指向的内容不能被修改)const关健字总是出现在*的左边而const指针(指针本身不能被修改)const关健字总是出现在*的右边,那不用说两个const中间加个*肯定是指针本身和它指向的内容都是不能被改变的。有了这个规则是不是就好记多了。

      什么还是晕,那就看下面的程序,你把它编译一下看看错误提示就明白了。
Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/--> 1 #include <iostream>

using namespace std;

int main(int argc, char *argv[])
{
    int a=3;
    int b;
    
    /*定义指向const的指针(指针指向的内容不能被修改)*/ 
    const int* p1; 
    int const* p2; 
    
    /*定义const指针(由于指针本身的值不能改变所以必须得初始化)*/ 
    int* const p3=&a; 
    
    /*指针本身和它指向的内容都是不能被改变的所以也得初始化*/
    const int* const p4=&a;
    int const* const p5=&b; 
    
     p1=p2=&a; //正确
     *p1=*p2=8; //不正确(指针指向的内容不能被修改)
    
     *p3=5; //正确
     p3=p1; //不正确(指针本身的值不能改变) 
    
     p4=p5;//不正确 (指针本身和它指向的内容都是不能被改变) 
     *p4=*p5=4; //不正确(指针本身和它指向的内容都是不能被改变) 
     
    return 0; 
}

### C语言 `const` 修饰指针的用法及案例分析 #### 1. 基础概念 在C语言中,`const` 关键字用于定义常量,当它与指针结合时,可以根据其位置不同来限制指针的行为。具体来说,`const` 可以用来修饰指针本身或者指针所指向的数据。 --- #### 2. 不同场景下的 `const` 修饰指针 ##### (1) **仅修饰指针指向的内容** 如果 `const` 出现在 `*` 的左侧,则表示该指针指向的内容是只读的,无法通过此指针修改其所指向的值[^1]。 ```c int a = 10; const int *p = &a; // const 在 * 左侧,说明 p 指向的内容不可修改 *p = 20; // 错误:不能通过 p 修改 a 的值 ``` 在这种情况下,虽然指针指向的内容不可变,但指针本身的值是可以改变的: ```c int b = 30; p = &b; // 正确:允许更改指针指向其他变量 printf("%d\n", *p); // 输出 30 ``` --- ##### (2) **仅修饰指针本身** 如果 `const` 出现在 `*` 的右侧,则表示指针本身是一个常量,不允许重新赋值给另一个地址[^2]。 ```c int a = 10, b = 20; int * const p = &a; // const 在 * 右侧,说明指针本身不可修改 p = &b; // 错误:不能更改指针指向的地址 *a = 30; // 正确:可以通过解引用操作符修改 a 的值 printf("%d\n", *p); // 输出 30 ``` 在这里,尽管指针本身不可变,但它指向的内容却是可写的。 --- ##### (3) **同时修饰指针及其指向的内容** 如果 `const` 同时出现在 `*` 的两侧,则既限制了指针指向的内容不可写入,也限制了指针本身不可重定向[^3]。 ```c int a = 10; const int * const p = &a; // const 修饰 * 和变量 *p = 20; // 错误:不能修改指针指向的内容 p = NULL; // 错误:不能修改指针自身的值 ``` 这种形式通常用于保护数据的安全性和一致性,在某些特定场合下非常有用。 --- #### 3. 实际应用案例 以下是几个实际应用场景的例子: ##### (1) **函数参数传递中的保护机制** 为了防止函数内部意外修改传入的指针或其指向的数据,可以使用 `const` 进行约束。 ```c void printArray(const int *arr, size_t length) { for (size_t i = 0; i < length; ++i) { printf("%d ", arr[i]); } } int main() { int array[] = {1, 2, 3}; printArray(array, sizeof(array)/sizeof(int)); } ``` 在这个例子中,`printArray` 函数接收了一个 `const int *` 类型的参数,表明不会对该数组进行任何修改。 --- ##### (2) **返回局部静态变量的指针** 有时我们需要从函数中返回一个指针,为了避免调用者修改原始数据,可以用 `const` 来限定返回值。 ```c const char *getGreeting() { static const char greeting[] = "Hello"; return greeting; } int main() { const char *msg = getGreeting(); msg[0] = 'h'; // 编译错误:试图修改只读字符串 } ``` 这里返回的是一个 `const char *`,确保外部代码无法篡改原字符串。 --- ##### (3) **多重指针的情况** 对于更复杂的结构,比如双重指针或多层嵌套,也可以利用 `const` 提供额外保障。 ```c int value = 42; const int *ptr1 = &value; // ptr1 是指向 const 数据的指针 const int **ptr2 = &ptr1; // ptr2 是指向 const 指针指针 **ptr2 = 99; // 错误:尝试修改 const 数据 (*ptr2)[0] = 88; // 错误:同样违反 const 约束 ``` --- ### 总结 通过对 `const` 放置位置的不同组合,可以在多种层面实现对指针行为的有效控制。这不仅有助于提高程序安全性,还能增强代码的可维护性。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值