关于c语言指针的两处小tip分享

2016-02-19 09:10 5 1 收藏

岁数大了,QQ也不闪了,微信也不响了,电话也不来了,但是图老师依旧坚持为大家推荐最精彩的内容,下面为大家精心准备的关于c语言指针的两处小tip分享,希望大家看完后能赶快学习起来。

【 tulaoshi.com - 编程语言 】

1:常量指针与指针常量

常量指针与指针常量名字很接近,但是两者区别很大。
常量指针是指指向常量的指针,例如:char const *st[4]="str";或者使用下面的方法,效果是一样的:const char *st[4]="str"; 它声明了一个指针变量,这个指针指向了一个常量字符串,但是由于指向的内存空间是常量,因此该地址的内容是不能修改的,例如:*st="no"; //这是不行的,因为内存空间的内容不能修改st="ok"; //这是可以的,虽然指向的内存内容不能修改,但是指针的指向是可以修改的。
指针常量是指一个指向固定内存单元的指针,其内容可以修改,但是不能改变指向的位置,例如:char *const st[4]="str";*st="ok"; //这是可以的,因为指向位置的内容可以修改。st="no"; //这样行不通,因为指针是不能改变指向位置,即如果初始化为地址0X8000,那么它只能指向这个位置,不能改变,但是0X8000的内容是可以改变的。

char *s = "abcde";
s[0] = '1';//此句在运行时出错

如下是可以的:

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com/bianchengyuyan/)

char s[] = "abcde";
s[0] = '1';

  
因为:

字符串常量是不能改的,编译后是放到只读内存(静态存储区)中的;

char[]和char*在很多地方可以通用,但是有个微妙的关系,那就是头指针相同;

因为“通过指针修改字符串常量的行为”是未定义的,上次就有个人问"为什么上述代码在TC下不报错而在VC6.0下报错"。不过,现在大多实现把常量字符串的存储空间设置为read-only,所以运行时报错;

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com/bianchengyuyan/)

char *s = "abcde";相当于const char *s = "abcde";

-------------------------------------------
按照楼上各位的说法,编译器应该禁止这么声明:
char *s = "abcde";
而强制我们如下声明:
const char *s = "abcde";
为什么编译器没有这么做呢?
--------------------------------------------
没错,的确因该像楼主说的那样,编译器应该禁止这种行为,进而帮助程序员写出正确的程序。
但是,这是一个特殊情况,是一个特例!
为什么这么说呢?因为char *s = "abcde";这种模式已经被很多人所使用(也包括楼主),它被使用的如此广泛以至于标准给它一些宽容:允许这样的代码通过编译。

-------------------------------------------- 《effective c++》91页注释1:
在C++ standard中,"Hello"的型别是const char[];这个型别几乎总是被视为const char*。因此我们预期,以一个字符串子面常量(string literal,例如"hello")作为一个char*变量的初值,会违反常量性。但是此种行为在C语言中实在太过频繁,所以C++ standard对于这样的初始化动作特别给与豁免。尽管如此,你还是应该避免这么做,因为那毕竟不被大家认同。

来源:http://www.tulaoshi.com/n/20160219/1589785.html

延伸阅读
  对于众多人提出的c/c++中指针难学的问题做个总结: !-- frame contents -- !-- /frame contents -- 指针学习不好要害是概念不清造成的,说的简单点就是书没有认真看,指针的学习如同人在学习饶口令不多看多学多练是不行的,下面是两个很经典的例子,很多书上都有,对于学习的重点在于理解*x和x的...
基本解释 通过上一篇的分析,我们已经很清楚地知道:指针不是一个简单的类型,它是一个本身和所指向物相复合的类型。指针的算术运算(如步进)与指针所指向物的类型密切相关。 问题:指针步进 & 步进单位 下面的代码中打印出的结果是几? int arContext[5] ={0,1,2,3,4}, i, *pAr; pAr = arCo...
C++中,成员指针是最为复杂的语法结构。但在事件驱动和多线程应用中被广泛用于调用回叫函数。在多线程应用中,每个线程都通过指向成员函数的指针来调用该函数。在这样的应用中,如果不用成员指针,编程是非常困难的。 刚遇到这种语法时也许会让你止步不前。但你会发现,使用恰当的类型定义之后,复杂的语法是可以简化的。本文引导你了解成...
数据在内存的存放有以下几种形式 1.栈区--由编译器自动分配并且释放,该区域一般存放函数的参数值,局部变量的值等, 2.堆区--一般由程序员分配释放,如果程序员不释放,程序结束的时候才会被操作系统回收, 3.寄存器区--用来保存栈顶指针和指令指针 4.全局去--也是静态区,全局变量和静态变量都是存储在一起的,初始化的全局变量和静态变...
对于众多人提出的c/c++中指针难学的问题做个总结: 指针学习不好关键是概念不清造成的,说的简单点就是书没有认真看,指针的学习犹如人在学习饶口令不多看多学多练是不行的,下面是两个很经典的例子,很多书上都有,对于学习的重点在于理解*指针运算符的作用,假设定义了一个指针变量x,*x所表示的其实就是变量a本身,x表示的是变量a在内存中...

经验教程

597

收藏

33
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部