Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2565867
  • 博文数量: 315
  • 博客积分: 3901
  • 博客等级: 少校
  • 技术积分: 3640
  • 用 户 组: 普通用户
  • 注册时间: 2011-05-08 15:32
个人简介

知乎:https://www.zhihu.com/people/monkey.d.luffy Android高级开发交流群2: 752871516

文章分类

全部博文(315)

文章存档

2019年(2)

2018年(1)

2016年(7)

2015年(32)

2014年(39)

2013年(109)

2012年(81)

2011年(44)

分类: C/C++

2011-06-30 16:19:58

 一、关于#include编译时出错:
会报错 undefined reference to 'sqrt'
  解决:编译时 # gcc xx.c -o test -lm //表示链接到数学库
  原因:gcc指定库,不包括math.h

  二、for(int i = 0; i < 10; i ){}报错:
      'for'loop initial declaration ouside C99 mode;
  解决:i 放在外面定义 int i = 0;
       for(){}
  原因:C99和C89标准不同

  、定义多维数组的时候出现警告!
        int a[4][4] = {
            0, 1, 0, 1,
            1, 0, 1, 0,
            0, 1, 0, 1,
            1, 0, 1, 0,
       }
         warning: missing braces around initializer
         warning: (near initialization for ‘m[0]’)
 
解决:增加{},如
          
int a[4][4] = {
            {0, 1, 0, 1},
            {1, 0, 1, 0},
            {0, 1, 0, 1},
            {1, 0, 1, 0},
       }
 
  原因:我认为是编译器的识别问题,如果加了{}的话,编译器会自动认为是二维数组,否则报警
  四 关于const定义并试图修改的时候出现的相关错误:
         const.c: In function ‘main’:
         const.c:27: error: assignment of read-only variable ‘c’
  
原因:下面就const这个关键字,我们来作一些简单的实验吧。感觉自己试过了就好了。反正就是这作用。
           具体深层次的东西我们就不钻研了。
          事例如下:
  1 #include
  2
  3 int main(int argc, const char *argv[])
  4 {
  5     int temp = 8;
  6     int change = 9;
  7     const int* a = &temp; //*a can't change,
  8                         // a can be changed
  9     int const *b = &temp; // *b can't change
 10                         // b can be changed
 11     int* const c = &temp; //*c can be changed
 12                         // c can't be changed
 13     const int* const d = &temp; // *d && d can    't be changed
 14    
 15     printf("%d  0x%x\n", *a, (unsigned int)a);
 16    
 17     //*a = change;
 18     a = &change;
 19    
 20     printf("%d  0x%x\n", *a, (unsigned int)a);
 21    
 22     //*b = change;
 23     b = &change;
 24    
 25     printf("%d  0x%x\n", *b, (unsigned int)b);
 26    
 27     *c = change;
28    // c = &change;
 29
 30     printf("%d  0x%x\n", *c, (unsigned int)c);
 31
 32
 33     //*d = change;
 34     //d = &change;
 35
 36     printf("%d  0x%x\n", *d, (unsigned int)d);
 37
 38
 39     return 0;
 40 }
  分下:首先从第一个打印开始测试,当然没什么问题。然后我们试图修改*a的值,发现报错了。说是这是
         只读的,所以const 放在*之前的作用就是限定值不可改变,但是指针确实可以被修改。所以
a = &change;
         是正确的。
         同理第二种定义形式:
int const *b = &temp;也是同样的结果。

         第三种
int* const c = &temp; 就不同了,而且恰好是相反的效果。也就是地址不可以改变,而值
         可以改变。
         
          第四种const int* const c = &temp;就是上述两种的综合,所以啥都不能修改。
   总结:   简单的就是:1.const 在 * 号左边的时候,表示其指针指向的内存单元内容不能修改,而指针本身可以修改。
                                 2.const 在 * 号右边表示其指针本身不能修改,但是指针指向的内存单元的内容可以被修改。
                                 3. 综合以上两种形式的话,那啥都干不了了。
              这是网上的说法。应该不错:
                  char * const p; //常量指针,p的值不可以修改

                  char const * p;//指向常量的指针,指向的常量值不可以改 const char *p; //和char const *p

                 (3)char str1[] = "abc"; char str2[] = "abc"; const char str3[] = "abc"; const char str4[] = "abc"; const char *str5 = "abc"; const char *str6 = "abc"; char *str7 = "abc"; char *str8 = "abc"; cout < < ( str1 == str2 ) < < endl; cout < < ( str3 == str4 ) < < endl; cout < < ( str5 == str6 ) < < endl; cout < < ( str7 == str8 ) < < endl;

                      结果是:0 0 1 1 str1,str2,str3,str4是数组变量,它们有各自的内存空间;而str5,str6,str7,str8是指针,它们指向相同的常量区域。


              具体怎么用,以后估计就有体现了。现在我编写程序的时候,用到了内存布局的知识,还有就是关于指针作为参数和变量直接作为参数的诸多情况。比如在xxxx.h头文件中定义一个结构体,在main.c中用结构体定义一个新的对象,那么问题就会出现了。假设你的结构体里面有一个n维数组,那么在main.c中去定义一个对象的时候,它默认是不会初始化的,所以,你需要去全部初始化。为什么呢?因为在main.c中去定义结构体对象的时候,是在栈中去分配内存空间的。栈中原来存的是什么,就是什么。所以我想当然的认为除了我赋值过的数组元素,其它都为0。
               还有一些。突然想不起来了。上面的是我在作俄罗斯方块的时候,遇到的问题。还有很多......
  五
  六

阅读(1744) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~