黑马程序员技术交流社区

标题: C中一个面试题:指针常量和常量指针的问题 [打印本页]

作者: 王士钊_BaSe3    时间: 2015-12-20 15:29
标题: C中一个面试题:指针常量和常量指针的问题
原题是一个代码语言题,然后问是否报错以及会输出什么。

这也是一个朋友去参加校招的一个简单笔试题。

刚好我几个礼拜前无聊看了本C编程入门书籍,巩固下。

从变量的作用域方面来看一遍

1.static 变量只被初始化一次

这个对于把变量放在全局中比较好了解。

但是比如放在了方法了

void Scope_Test()

{

    static int a = 0;

    static int b;

   

    b = 1;

   

    printf("a= %d和 a的地址 %p--b = %d和b的地址%p\n",a++,&a,b++,&b);

}

因为以前我们刚看对于申明变量和初始化变量时了解到

int a = 2;//申明 然后初始化a = 2;

和int 2;a = 2;//同上

感觉上是等价的。

但是通过上面的方法测试后发现输出是

a= 0和 a的地址 0x10d27e090--b = 1和b的地址0x10d27e094

a= 1和 a的地址 0x10d27e090--b = 1和b的地址0x10d27e094

a= 2和 a的地址 0x10d27e090--b = 1和b的地址0x10d27e094

a= 3和 a的地址 0x10d27e090--b = 1和b的地址0x10d27e094

a= 4和 a的地址 0x10d27e090--b = 1和b的地址0x10d27e094

(测试时将该方法执行了多次)

通过log发现对于static 类型的a变量的值的改变是符合我们的理解的。

但是对于b发现一直是1.

然后自己琢磨下,int b;和 b = 1; 其实是两条语句操作。

c语言对于申明 int b;但是没有紧接着当前语句的初始化操作时,自动初始化成了0.

在执行第二条语句 b = 1;其实是个赋值过程了。

因此当我我们看到上面的输出时,通过地址输出就可以看出,并不是b又被初始化了,只是每次调用都被重新赋值

为1而已。


2.指针常量和指向常量的指针。

const int *p和int *const p;

前者是表示指向常量的指针,既我们不能通过指针来改变指针指向的变量的值

比如

    int a = 3   ;

    const int *b;

    b = &a;

    (*b) = 4;//编译器会报错,提示a是只读的。

但是我们可以给b重新赋值

     int c = 9;

     b = &c;


后者表示的是指针p是个常量,既p被初始化后就不能改变

     int a = 3;

      int *const b = &a;

    (*b) = 4;

这边再提到个小问题。

如果写成

int *const b;

b = &a;

同样是报错的。这个解释和上面提到的申明和初始化的理解应该是一样的。

申明后自动初始化了,第二句语句是执行了二次赋值,常量不能被重复赋值。

因此记得书上也提到过,常量的申明必须给其初始化赋值,反之你想稍后给其赋值,

但是系统已经给其初始化了,就无法进行你要的赋值操作,常量定义的也就失去了你要表达的意义


当然最后还有种变态表示法是

const int *const p;固定不能改。
作者: 沐一风    时间: 2015-12-20 19:59
飞速的表示看不懂啊啊  啊啊 啊啊  
作者: HHE_johnson    时间: 2015-12-21 11:35
写得很好,要是记忆的话,常量指针说明指针是个常量,一旦赋值地址就不可以再变。而指针常量是指常量一旦赋值就不可以改变,但是地址可以改变
作者: wkop    时间: 2015-12-21 12:27
好,引发思考!
作者: 劉一刀    时间: 2015-12-21 22:33
总结的很不错
作者: ruoxiwang92    时间: 2015-12-22 00:05
厉害厉害,谢谢分享
作者: luoye111    时间: 2015-12-22 00:42
66666666666
作者: wx_000001    时间: 2015-12-22 16:47
王士钊_BaSe3 发表于 2015-12-20 15:29
原题是一个代码语言题,然后问是否报错以及会输出什么。

这也是一个朋友去参加校招的一个简单笔试题。

总结的很赞
作者: chensc    时间: 2015-12-22 21:00
学习学习!
作者: 10047201    时间: 2015-12-22 21:39
赞赞,顶一个
作者: 小ㄟMò    时间: 2015-12-23 12:13
顶一个!
作者: qu29437    时间: 2015-12-23 12:29
加油好好学习天天向上
作者: BOb_小星    时间: 2015-12-23 12:58
受教受教
作者: 15931110616    时间: 2015-12-23 13:27
这是面试题吗?





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2