指针知识梳理6-const与指针
const 定义的变量为仅仅读变量。在语法层面上通过这个变量去改动内存是不同意的。
可是对于下面代码。就有非常多人绕了:
const int *p1; //p1能变。*p1不能变
int const *p2; //p2能变。*p2不能变
int *const p3; //p3不能变。*p2能变
我们通过代码来验证说明这三种写法:
</pre><p></p><pre>
#include <stdio.h>
int main()
{
int a;
int b;
const int *p1 = &a;//初始化
int const *p2 = &a;//初始化
int *const p3 = &a;//初始化 a = 1; //说明a相关的内存可读写 // p1 p2 是一样效果。
p1 = &b; //编译通过,说明p1本身能够写。
*p1 = 1; //编译不通过,说明语法上不同意 通过p1 去写a 的内存。 p2 = &b; //编译通过,说明p2本身能够写。
*p2 = 1; //编译不通过, 说明语法上不同意 通过p2 去写a 的内存。
//注意以上a 本身的内存是可读写的,仅仅只是通过p1 p2没有权限去改动。 p3 = &b; //编译不通过,说明p3本身不能够写。
*p3 = 1; //编译通过。说明语法上 能够通过p3去改动a的内存。 return 0;
}
对于上面记忆有个小技巧,当 const 在*的左边的时候,修饰的是 *p ,则 *p 是不能改变的。也就是说所谓不能改变p指向的内存。
当const 在*右边的时候,修饰的是 p ,p不能改变。
const 与指针结合 用来提高程序猿写代码的严谨性:
比方下面代码
void strcpy(char *src ,const char *dest);
这个strcpy函数期望做的是 把dest指向的内存处的字符串复制到 src指向的内存处。
那么事实上 这样的函数接口也可以全然实现,可是。假设在实现strcpy的时候,在函数中不小心改动了 dest指向的内存,那么就改函数接口的本意有悖,由于 依照正常逻辑,你拷贝东西的时候不会改变原来的东西。
比方不小心写了下面代码
void strcpy(char *dest ,char *src)
{
*src = 'a';
//其它代码
}
这样语法上没问题。可是执行就有问题了。
假设接口设计成 const char *src
void strcpy(char *dest ,const char *src)
{
*src = 'a'; //当写出这种代码的时候编译就会报错,提高了代码的安全性。 //其它代码
}
指针知识梳理6-const与指针的更多相关文章
- 【原创】浅谈指针(五)const和指针
前言 过了几个月再次更新.最近时间也不多了,快要期中考试了,暂且先少写一点吧. 本文仅在博客园发布,如在其他平台发现均为盗取,请自觉支持正版. 练习题 我们先来看几道题目.如果这几道题都不会的话,就先 ...
- const 指针与指向const的指针
最近在复习C++,指针这块真的是重难点,很久了也没有去理会,今晚好好总结一下const指针,好久没有写过博客了,记录一下~ const指针的定义: const指针是指针变量的值一经初始化,就不可以改变 ...
- 指针总结指向const的指针、const指针、指向const指针的const指针
指针的一些总结 const与指针 指向const的指针指的是指针指向的数据是常量,不可以被修改,但指针变量本身可以被修改,如const int *p:严格说不能用指针间接修改指向的数据,但该变量可 ...
- C++中指向对象的常指针和指向常对象的指针
指向对象的常指针 将指向对象的指针变量声明为const型,并使之初始化,这样指针值始终保持为其初始值,不能改变. Time t1(10,12,15),t2; Time * const ptr1=&am ...
- const 相关知识 const和指针、const和引用
以前老是对const概念不清不楚,今天算是好好做个笔记总结一下.以下内容包括1)常量指针(指针本身是常量),2)指针常量(指针指向的是常量对象),3)常量引用,4)const成员函数. 常量指针,指针 ...
- [C++ Primer Plus] 第7章、函数(一)程序清单——递归,指针和const,指针数组和数组指针,函数和二维数组
程序清单7.6 #include<iostream> using namespace std; ; int sum_arr(int arr[], int n);//函数声明 void ma ...
- c++面试题中经常被面试官面试的小问题总结(二)(本篇偏向指针知识)
原文作者:aircraft 原文链接:https://www.cnblogs.com/DOMLX/p/10713204.html 1.利用指针交换两个字符串方法?(这题是我当年读大一的时候看到的,好怀 ...
- C++中的const和指针组合
在C++里,const修饰指针有以下三种情况 (1)指针常量:即指向常量的指针 const int *p或者int const *p const在*前,,可以这样理解它的功能,因为const在*前, ...
- 面试集锦-常量,const, const 对指针的影响
在C语言中不可改变的数据(量)就是常量 在C语言中有三种常量 字面量(直接量),就是直接写出来的,从写法上就可以看出值与类型等,例如:19,123.456等 名字常量 ...
随机推荐
- HASH Partitioning--转载
原文地址:https://dev.mysql.com/doc/refman/5.1/en/partitioning-hash.html HASH Partitioning [+/-] 18.2.3.1 ...
- Servlet简单注解方式使用
我们是用Servlet进行跳转的时候都需要去web.xml中进行配置,分繁琐. 那么今天就学习下使用注解方式配置servlet一样好使 package com.shxt.servlet; import ...
- var和ES6的let
来源自:http://www.jstips.co/zh_cn/javascript/keyword-var-vs-let/ 特此做个笔记 概述 通过 var 定义的变量,它的作用域是在 functio ...
- BZOJ4025: 二分图(LCT)
Description 神犇有一个n个节点的图.因为神犇是神犇,所以在T时间内一些边会出现后消失.神犇要求出每一时间段内这个图是否是二分图.这么简单的问题神犇当然会做了,于是他想考考你. Input ...
- 18/9/16牛客网提高组Day2
牛客网提高组Day2 T1 方差 第一眼看就知道要打暴力啊,然而并没有想到去化简式子... 可能因为昨晚没睡好,今天上午困死 导致暴力打了一个半小时,还不对... #include <algor ...
- 洛谷 P3003 [USACO10DEC]苹果交货Apple Delivery
洛谷 P3003 [USACO10DEC]苹果交货Apple Delivery 题目描述 Bessie has two crisp red apples to deliver to two of he ...
- javascript中函数声明、变量声明以及变量赋值之间的关系与影响
javascript中函数声明.变量声明以及变量赋值之间的关系与影响 函数声明.变量声明以及变量赋值之间有以下几点共识: 1.所有的全局变量都是window的属性 2.函数声明被提升到范围作用域的顶端 ...
- “ping”命令的原理就是向对方主机发送UDP数据包,HTTP在每次请求结束后都会主动释放连接,因此HTTP连接是一种“短连接”
Socket 是一套建立在TCP/IP协议上的接口不是一个协议 应用层: HTTP FTP SMTP Web 传输层: 在两个应用程序之间提供了逻辑而不是物理的通信(TCP UDP) T ...
- 3lession-python编程规范
今天继续学习python,内容主要就是python编程过程中的一些规范,包括注释.换行等 1.注释 所有的注释都是以#开头,注释可以单独占有一行,也可以放到语句的末尾.因为python没有多行注释,所 ...
- Android学习笔记之Bitmap位图的旋转
位图的旋转也可以借助Matrix或者Canvas来实现. 通过postRotate方法设置旋转角度,然后用createBitmap方法创建一个经过旋转处理的Bitmap对象,最后用drawBitmap ...