彻底搞定C语言指针 第四篇

1 int i 说起

你知道我们申明一个变量时象这样int i ;这个i是可能在它处重新变赋值的。 如下:

int i=0;

//…

i=20;//这里重新赋值了

不过有一天我的程 序可能需要这样一个变量(暂且称它变量),在申明时就赋一个初始值。之后我的程序在其它任何处都 不会再去重新对它赋值。那我又应该怎么办呢?用const .

//**************

const int ic =20;

//…

ic=40;//这样是不可以的,编译时是无法通过,因为我们不能对 const 修饰的ic重新赋值的。

//这样我们的程序就会更早更容易发现问题了。

//**************

有了const修饰的ic 我们不称它为变量,而称符号常量,代表着20这 个数。这就是const 的作用。ic是不能在它处重新赋新值了。

认识了const 作用之后,另外,我 们还要知道格式的写法。有两种:const int ic=20;与int const ic=20;。它们是完全相同的。这一 点我们是要清楚。总之,你务必要记住const 与int哪个写前都不影响语义。有了这个概念后,我们来看 这两个家伙:const int * pi与int const * pi ,按你的逻辑看,它们的语义有不同吗?呵呵,你只要 记住一点,int 与const 哪个放前哪个放后都是一样的,就好比const int ic;与int const ic;一样 。也就是说,它们是相同的。

好了,我们现在已经搞定一个“双包胎”的问题。那么 int * const pi与前两个式子又有什么不同呢?我下面就来具体分析它们的格式与语义吧!

2 const int * pi的语义

我先来说说const int * pi是什么作用 (当然int const * pi也是一样 的,前面我们说过,它们实际是一样的)。看下面的例子:

//*************代码开始 ***************
int i1=30;
int i2=40;
const int * pi=&i1;
pi=&i2;    //4.注意这里,pi可以在任意时候重新赋值一个新内存地址
i2=80;    //5.想想看:这里能用*pi=80;来代替吗?当然不能
printf( “%d”, *pi ) ;  //6. 输出是80
//*************代码结束***************

语义分析:

看出来了 没有啊,pi的值是可以被修改的。即它可以重新指向另一个地址的,但是,不能通过*pi来修改i2的值。 这个规则符合我们前面所讲的逻辑吗?当然符合了!

首先const  修饰的是整个*pi(注意,我 写的是*pi而不是pi)。所以*pi是常量,是不能被赋值的(虽然pi所指的i2是变量,不是常量)。

其次,pi前并没有用const 修饰,所以pi是指针变量,能被赋值重新指向另一内存地址的。你可 能会疑问:那我又如何用const 来修饰pi呢?其实,你注意到int * const pi中const 的位置就大概可 以明白了。请记住,通过格式看语义。哈哈,你可能已经看出了规律吧?那下面的一节也就没必要看下 去了。不过我还得继续我的战斗!

3 再看int * const pi

确实,int * const pi与前面 的int const * pi会很容易给混淆的。注意:前面一句的const 是写在pi前和*号后的,而不是写在*pi 前的。很显然,它是修饰限定pi的。我先让你看例子:

//*************代码开始 ***************
int i1=30;
int i2=40;
int * const pi=&i1;
//pi=&i2;    4.注意这里,pi不能再这样重新赋值了,即不能再指向另一个新地址。
   //所以我已经注释了它。
i1=80;    //5.想想看:这里能用*pi=80;来代替吗?可以,这 里可以通过*pi修改i1的值。
     //请自行与前面一个例子比较。
printf( “% d”, *pi ) ;  //6.输出是80
//***************代码结束 *********************

语义分析:

看了这段代码,你明白了什么?有没有发现 pi值是不能重新赋值修改了。它只能永远指向初始化时的内存地址了。相反,这次你可以通过*pi来修改 i1的值了。与前一个例子对照一下吧!看以下的两点分析

1)pi因为有了const 的修饰,所以只 是一个指针常量:也就是说pi值是不可修改的(即pi不可以重新指向i2这个变量了)(看第4行)。

2)整个*pi的前面没有const 的修饰。也就是说,*pi是变量而不是常量,所以我们可以通过 *pi来修改它所指内存i1的值(看5行的注释)

时间: 2024-11-02 23:48:00

彻底搞定C语言指针 第四篇的相关文章

彻底搞定C语言指针 第六篇

指向另一指针的指针 一.针概念: 早在本系列第二篇中我就对指针的实质进行了阐述 .今天我们又要学习一个叫做指向另一指针地址的指针.让我们先回顾一下指针的概念吧! 当我 们程序如下申明变量: short int i: char a: short int * pi: 程序会 在内存某地址空间上为各变量开辟空间,如下图所示. 内存地址→6 7 8 9 10 11 12 13 14 15 ------------------- --------------------------------------

彻底搞定C语言指针 第七篇

函数名与函数指针 一 数调用 一个通常的函数调用的例子: //自行包含 头文件 void MyFun(int x); //此处的申明也可写成:void MyFun( int ); int main(int argc, char* argv[]) { MyFun(10); //这里是调用MyFun(10);函数 return 0; } void MyFun(int x) //这里定义一个MyFun函数 { printf ("%d\n",x); } 这个MyFun函数是一个无返回值的函数,

彻底搞定C语言指针 第五篇

一.三道考题 开讲之前,我先请你做三道题目.(嘿嘿,得先把你的头脑搞昏才行 --唉呀,谁扔我鸡蛋?) 1.考题一:程序代码如下: void Exchg1(int x, int y) { int tmp; tmp=x; x=y; y=tmp; printf ("x=%d,y=%d\n",x,y) } void main() { int a=4,b=6; Exchg1 (a,b) ; printf("a=%d,b=%d\n",a,b) } 输出的结果 : x=____,

彻底搞定C语言指针 第三篇

1.数组元素 看下面代码 int i,a[]={3,4,5,6,7,3,7,4,4,6}; for (i=0;i<=9;i++) { printf ( "%d", a[i] ); } 很显然,它是显示a 数组的各元素值. 我们还可以这样访问元素,如下 int i,a[]={3,4,5,6,7,3,7,4,4,6}; for (i=0;i<=9;i++) { printf ( "%d", *(a+i) ); } 它的结果和作用完全一样 2. 通过指针访问数

彻底搞定C语言指针 第一篇

1.语言中变量的实质 要理解C指针,我认为一定要理解C中"变量"的存储实质, 所以我就从"变量"这个东西开始讲起吧! 先来理解理解内存空间吧!请看下图: 内存地址→ 6 7 8 9 10 11 12 13 ----------------------------------------------------------------- ... | | | | | | | |.. ------------------------------- ------------

彻底搞定C语言指针 第二篇

二.指针是什么东西 想说弄懂你不容易啊!我们许多初学指针的人都要这样的感慨.我常常在思索它,为什么呢?其实生活中处处都有指针.我们也处处在使用它.有了它我们的生活才更加方便 了.没有指针,那生活才不方便.不信?你看下面的例子. 这是一个生活中的例子:比如说你要 我借给你一本书,我到了你宿舍,但是你人不在宿舍,于是我把书放在你的2层3号的书架上,并写了一 张纸条放在你的桌上.纸条上写着:你要的书在第2层3号的书架上.当你回来时,看到这张纸条.你就 知道了我借与你的书放在哪了.你想想看,这张纸条的作

开发unity插件——一次搞定unity编辑器常用功能

开发unity插件--一次搞定unity编辑器常用功能 这篇文章主要分享unity中与editor插件等相关的使用,比较基础,不过如果都掌握了就可以扩展写一些unity插件了,平时开发中也会提升工作效率. editor相关脚本一定要放在Editor文件夹下,继承monobehaviour的文件不要放到Editor文件夹下. monobehaviour相关的编辑器功能 首先常用的在继承monobehaviour类中写public变量可以在inspector中序列化可编辑一般人都知道了,下面是一些可

写软文有麻烦?四招教你轻松搞定

软文写作一直是很多站长最头痛的问题,但是写软文又是站长们做SEO必须学会的技能之一,于是很多站长就被这个软文写作的问题折磨的半死不活.那么到底怎么样才能写出高质量的软文呢? 前几天听到一句话说一个好网站的结构应该是"标题要性感,内容要丰满,关键部位要突出,代码要骨感".其实,一篇好的软文也必须满足这四个要求. 一.标题要性感 标题是软文撰写的重要一部分,是衡量一篇软文成功与否和检验作者撰写水平的重要评判标准,同时也是你能否吸引读者的第一要素.所以文章的标题一定要性感,要能吸引人,要能在

c-C(++)语言 碰到输出手法 不能搞定 求解答 (注 : 不用迭代 )

问题描述 C(++)语言 碰到输出手法 不能搞定 求解答 (注 : 不用迭代 ) 1.读取一个文件 链接起来 行,列: 2.利用这个链表,输出成员间的所有可能组合: 本人挤出的代码如下,供参考: #include "stdafx.h" #include using namespace std; class Teacher { public: char name[20]; Teacher * tnext; Teacher (char * name):tnext(tnext=NULL) {