首页 > 其他分享 >二、常量指针与指针常量

二、常量指针与指针常量

时间:2024-06-30 21:41:42浏览次数:8  
标签:const 常量 指向 int 修改 指针

一、常量指针:又叫常指针,可以理解为常量的指针,即也是指针,指向的是个常量(指向的对象是常量)。指针变量可以修改, 但是不能通过指针来修改其指向的对象。

代码形式:

int const* p;
const int* p;

举例:

 1 #include<stdio.h>
 2 
 3 int main()
 4 {
 5     int a = 10;
 6     const int *p;
 7     p = &a;
 8     *p = 12;
 9     return 0;
10 }

第8行错误,错误信息:表达式必须是可修改的左值

编译报错:

.\const.c:8:8: error: assignment of read-only location '*p'

*p = 12;

但是p指向的地址是可修改的

 1 #include<stdio.h>
 2 
 3 int main()
 4 {
 5     int a = 10;
 6     int b = 30;
 7     const int *p;
 8     p = &a;
 9     p = &b;
10     return 0;
11 }

关键点:

1.常量指针指向的对象不能通过这个指针来修改,可是仍然可以通过原来的声明修改;

2.常量指针可以被赋值为变量的地址,之所以叫常量指针,是限制了通过这个指针修改变量的值;

3.指针还可以指向别处,因为指针本身只是个变量,可以指向任意地址;

二、指针常量:指针本身是个常量,不能再指向其他对象。指针常量的值是指针,这个值因为是常量,所以不能被赋值。

代码形式:

int* const p;

举例:

 1 #include<stdio.h>
 2 
 3 int main()
 4 {
 5     int a = 10;
 6     int b = 20;
 7     int *const p = &a;
 8     p = &b;
 9     return 0;
10 }

第8行显示错误:表达式必须是可修改的左值

编译报错:

.\const.c:7:7: error: assignment of read-only variable 'p'
p = &a;
^

关键点:

1.它是个常量!

2.指针本身是常量,指向的地址不可以变化,但是指向的地址所对应的内容可以变化;

三、区分

一种方式是看 * 和 const 的排列顺序,比如

int const* p;    //const * 即常量指针
const int* p;    //const * 即常量指针
int* const p;    //* const 即指针常量

还一种方式是看const离谁近,即从右往左看,比如

int const* p;    //const修饰的是*p,即*p的内容不可通过p改变,但p不是const,p可以修改,*p不可修改;
const int* p;    //同上
int* const p;    //const修饰的是p,p是指针,p指向的地址不能修改,p不能修改,但*p可以修改;

四、应用

在实际应用中,常量指针要比指针常量用的多,比如常量指针经常用在函数传参中,以避免函数内部修改内容。

size_t strlen(const char* src); //常量指针,src的值不可改变;
char a[] = "hello";
char b[] = "world";
size_t a1 = strlen(a);
size_t b1 = strlen(b);

 

标签:const,常量,指向,int,修改,指针
From: https://www.cnblogs.com/sunyiping/p/18276940

相关文章

  • The this Pointer (this 指针) and An Array of Objects (对象数组)
    ThethisPointer[this指针]andAnArrayofObjects[对象数组]1.The`this`Pointer(`this`指针)2.AnArrayofObjects(对象数组)References1.ThethisPointer(this指针)classStock{private: doubletotal_val_; ...public: double......
  • 对撞指针技巧
    对撞指针技巧我们以LeetCode的一道题目来讲解一下对撞指针;LeetCode第27题移除元素,链接如下:https://leetcode.cn/problems/remove-element如果使用快慢指针如果使用快慢指针,将会有大量的后面元素赋值给前面元素的操作,有没有其他不进行这么多次交换的思路呢?对撞指针我......
  • 对撞指针技巧
    对撞指针技巧我们以LeetCode的一道题目来讲解一下对撞指针;LeetCode第27题移除元素,链接如下:https://leetcode.cn/problems/remove-element如果使用快慢指针如果使用快慢指针,将会有大量的后面元素赋值给前面元素的操作,有没有其他不进行这么多次交换的思路呢?对撞指针我们的目......
  • 五、常量概念
    描述哪些不变的量。C语言中的常量分为以下以下几种:1.字面常量2.const修饰的常变量3.#define定义的标识符常量4.枚举常量1.字面常量2.const修饰的常变量不用const修饰的变量,可以更改。const修饰的变量不能更改了。在C语言中,const修饰的a,本质的变量,但是不能直......
  • C++ 智能指针
     问题引入intfunc1(intx){ inty=10; int*tmp=(int*)malloc(sizeof(int)*2); if(x==0) throw"func1_error"; else returnx+y; free(tmp);//抛异常造成异常安全问题,无法释放造成内存泄漏,}intmain(){ try{inta=func1(0);} catch(constc......
  • 三、变量和常量的概念
    1.概念变亮-可变的值常量-不可变的值2.变量定义3.变量的分类变量分为局部变量和全局变量局部变量-a在{}内部定义的变量全局变量-b在{}外部定义的变量全局变量和局部变量同时使用,则局部变量优先。全局变量和局部变量不建议名字相同。4.例子写一个代码,计......
  • C语言指针(三)
    数组地址我们知道,数组名即是数组的首地址,因此#include<stdio.h>intmain(){intarr[10]={1,2,3,4,5,6,7,8,9,10};printf("&arr[0]=%p\n",&arr[0]);printf("arr=%p\n",arr);return0;}我们会发现,二者地址相同即 那么如果数组名是首地址,以下代码该怎么解......
  • golang如何使用指针灵活操作内存?unsafe包原理解析
    Hi你好,我是k哥。一个大厂工作6年,还在继续搬砖的后端程序员。我们都知道,C/C++提供了强大的万能指针void*,任何类型的指针都可以和万能指针相互转换。并且指针还可以进行加减等算数操作。那么在Golang中,是否有类似的功能呢?答案是有的,这就是我们今天要探讨的unsafe包。本文将深入探......
  • C语言--指针详解(二)
    C语言--指针详解(二)一.前言二.指针运算(1)指针+-整数(2)指针-指针(3)指针的关系运算三.指针类型分类及详解(1)整型指针(2)浮点型指针(3)字符指针(4)特殊指针类型void*(5)函数指针(6)数组指针(7)结构体指针五.指针与数组5.1数组名的理解5.2数组指针5.3指......
  • 代码随想录Day1-二分查找法|快慢指针
    二分查找题目链接二分查找是一个较为基础的查找方式,对一个有序没有重复值的数组进行查找时,能够提供一个较好的时间复杂度\(O(log(n))\)算法概要对于有序并且没有重复值的数组来说,我们可以首先选定整个数组的中间下标,它的值则称为中间值,通过它把大数组分成两个小的数组,其中一个......