一、关于#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。
还有一些。突然想不起来了。上面的是我在作俄罗斯方块的时候,遇到的问题。还有很多......
五、
六、
阅读(1804) | 评论(0) | 转发(0) |