原题是一个代码语言题,然后问是否报错以及会输出什么。
这也是一个朋友去参加校招的一个简单笔试题。
刚好我几个礼拜前无聊看了本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;固定不能改。 |
|