黑马程序员技术交流社区
标题:
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