首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

关于 常量和指针的有关问题? 各种大神请进

2013-08-09 
关于 常量和指针的问题? 各种大神请进const int a 1int *p &a*p 10000printf(%d\n,a)resualt

关于 常量和指针的问题? 各种大神请进
const int a = 1;
int *p = &a;
*p = 10000;
printf("%d\n",a);

resualt :  a =10000

a 的值为什么可以改变了?
a在常量区的啊。
C语言里面的const 难道只有一半的作用?难道只是一种提示?


求详细解答,越详细越好。

1、另外再求一些关于 字符串 数组  指针 这3个东西相比较的一些资料,越详细越好,
2、还有malloc 内存分配 更加深入的更加详细的一些资料。

《C和指针》这本书上1、这方面的内容我看的不是特别清楚。

先谢谢了。 指针 C 内存分配 malloc
[解决办法]
首先你说的const修该的变量a是常量就错误。这就直接导致你认为后面全是错的。Const并不会修改变量的存储位置,a定义的空间仍然是可读写,因为它的存储空间不在常量区。const它的功能仅仅是告诉编译器变量a不能当左值,如果在后面碰到a为左值的话,报错。但是并不妨碍我们用变量p指向a的空间修改a的值。Const仅仅是在C语言层面模拟的假常量,只要用指针变量就能突破这种假象。
[解决办法]

引用:
Quote: 引用:


  1 #include <stdio.h>
  2 
  3 int main (void )
  4 {
  5 
  6     const int a = 1;
  7     int *p = ( int*) &a;
  8     *p = 10000;
  9     printf(" a   = %d\n",a);
 10     printf(" &a  = %p\n",&a);
 11     printf(" *p  = %d\n",*p);
 12     printf(" p   = %p\n",p);
 13 
 14 }
                             


输入结果:

 a  = 1
 &a  = 0xbf904d38
 *p = 10000
 p  = 0xbf904d38



字符串 数组 指针 看看在这个,自己好好理解下 地址 和指针的关系!
http://blog.csdn.net/yanludroiyan/article/details/3995276


对于malloc函数 分配堆空间
http://lionwq.spaces.eepw.com.cn/articles/article/item/18555
看看博客吧!


自己多多敲下代码,实践才是检验真理的唯一标准!
不懂的可以继续来问 关于 常量和指针的有关问题? 各种大神请进







引用:
Quote: 引用:

const int a = 1;
int *p = &a;
*p = 10000;
printf("%d\n",a);

resualt :  a =10000

a 的值为什么可以改变了?
a在常量区的啊。
C语言里面的const 难道只有一半的作用?难道只是一种提示?


求详细解答,越详细越好。

1、另外再求一些关于 字符串 数组  指针 这3个东西相比较的一些资料,越详细越好,
2、还有malloc 内存分配 更加深入的更加详细的一些资料。

《C和指针》这本书上1、这方面的内容我看的不是特别清楚。

先谢谢了。


  1 #include <stdio.h>
  2 int main(void){
  3     const int a =1;
  4     int * p = (int *) &a;
  5     *p = 200;
  6     printf("a  = %d\n",a);
  7     printf("&a = %p\n",&a);
  8     printf("*p = %d\n",*p);
  9     printf("p  = %p\n",p);
 10     return 0;
 11 }



a  = 200
&a = 0x7fff3578f0a4
*p = 200
p  = 0x7fff3578f0a4

怎么回事?
gcc version 4.7.3 (Ubuntu/Linaro 4.7.3-1ubuntu1) 


脑袋都晕了,居然引用了。。



其实没必要纠结这种问题的,如果你是一个程序员的话,你也不可能写出这样的代码的!
const 变量是可读的,但是你把强转(int *) 说不定就让成为可读的了

编译器到底是怎么处理的,我们也不清楚,只能根据常规情况!

热点排行