A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

原题是一个代码语言题,然后问是否报错以及会输出什么。

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

刚好我几个礼拜前无聊看了本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;固定不能改。

13 个回复

倒序浏览
飞速的表示看不懂啊啊  啊啊 啊啊  
回复 使用道具 举报
写得很好,要是记忆的话,常量指针说明指针是个常量,一旦赋值地址就不可以再变。而指针常量是指常量一旦赋值就不可以改变,但是地址可以改变
回复 使用道具 举报
wkop 来自手机 中级黑马 2015-12-21 12:27:58
板凳
好,引发思考!
回复 使用道具 举报
总结的很不错
回复 使用道具 举报
厉害厉害,谢谢分享
回复 使用道具 举报
luoye111 来自手机 中级黑马 2015-12-22 00:42:20
7#
66666666666
回复 使用道具 举报
wx_000001 来自手机 中级黑马 2015-12-22 16:47:57
8#
王士钊_BaSe3 发表于 2015-12-20 15:29
原题是一个代码语言题,然后问是否报错以及会输出什么。

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

总结的很赞
回复 使用道具 举报
chensc 金牌黑马 2015-12-22 21:00:11
9#
学习学习!
回复 使用道具 举报
赞赞,顶一个
回复 使用道具 举报
小ㄟMò 来自手机 中级黑马 2015-12-23 12:13:48
11#
顶一个!
回复 使用道具 举报
qu29437 来自手机 中级黑马 2015-12-23 12:29:20
12#
加油好好学习天天向上
回复 使用道具 举报
BOb_小星 来自手机 中级黑马 2015-12-23 12:58:14
13#
受教受教
回复 使用道具 举报
这是面试题吗?
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马