C中一个面试题:指针常量和常量指针的问题

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Nono_Love_Lilith/article/details/8125254

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

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

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



没有更多推荐了,返回首页