给你添加了很多代码。
?
包含了输入输出函数,所以在程序的调试阶段,他是不可少的。
?
#include "gaozy" 这类头文件你见过么?它与#include
又有哪些区别呢?<>包含的头文件,编译器会在
系统目录中搜索。“”包含的头文件,编译器会先在当前工作目录中搜索,如果没有,再去系统目录中搜索。也可以简单的理解成C函数库里的函数在<>包含的头文件里,而我们自己写的函数则放在“”文件中。
?
?
?
6、变量作用域
?
int i;
?
while (1)
?
{
?
int i = 0;
?
printf("%d", i);
?
}
?
这样会报错么?当然不会,因为两个int i;并不在同一个作用域。
?
那么什么是作用域,怎么分辨作用域呢?
?
我们通常把一个{}内的代码看成在一个作用域。这也是为什么case里不可以定义变量的原因。
?
只有{}才可以分辨作用域么?
?
当然不是
?
while (1)
?
int i;
?
printf("hellow world!");
?
int i;自己单独在一个作用域中,printf()只会执行一次,当然这是一个死循环,不会执行到printf()。现在你有点略懂了么?跟while()相同的还有for(),if()
?
还有个问题你想过么?第一次循环定义一个 i,第二次循环又定义一个 i,这不重复定义了么?
?
当然不是,作用域内的变量是有生命周期的。也就是说,当第一次循环结束,你所定义的 i 的内存空间已经被释放。
?
?
7、伤脑筋的bug
?
你写过这样的程序么?
?
int i;
?
while (1)
?
{
?
int i = 0;
?
printf("%d", i);
?
int j;
?
}
?
编译器是这样报错的::\c\浅谈c.c(49) : error C2143: syntax error : missing ';' before 'type'
?
我英文不好,不理解这句话是什么意思,但是这段代码里根本不存在缺少;的情况。
?
我将代码粘到vs2010中,它是可以运行的。我一度怀疑是编译器出错了。但事实上编译器是很少出错的,纠结了很久,我突然想起来,c语言中规定,变量是必须在作用域的开始定义。vs210中,我用文件是后缀是.cpp的,就是是说c++允许在其他函数之后定义变量,而c对此则表示不支持。
?
?
?
你写的代码有没有之前运行正常,你只是修改了一点,语法上别没有出错。但编译器却报错了呢?
?
LINK : fatal error LNK1168: cannot open Debug/SMIS.exe for writing
?
之前遇见这个问题也是纠结很久,为什么一会儿可以编译,一会儿又让我等待呢?
?
这也不是编译器出错了。而是你执行了程序,没有关闭,对代码进行了修改,又要执行程序。
?
编译器如果会说话:“小子,你拿我开心呢吧,还能不能一起玩耍了。”
?
?
?
当你malloc时,要记得free啊,还有malloc之后跟上一个判断是有必要的。
?
p_head = (P_STUDENT)malloc(sizeof(STUDENT));
? ? ?if (NULL == p_head)
? ? ?{
? ? ? ? ?printf("动态内存分配失败,程序结束!");
? ? ? ? ?exit(-1);
? ? ?}
?
如果没有if()判断的话,在内存分配失败时,运行程序会出错,而且很难找到错误原因。
?
?
?
8、字符串,数组,指针
?
谈到字符串、数组、指针,那么我们就不得不谈内存了。我们可以把内存理解成一排很长很长的房子,它是一个线性结构。房子里住着不同的人家,每个房子有不同编号。
?
人家对应的是计算机里定义的变量,房子编号对应的是变量所在地址。所以,我们每定义一个变量,都会占用一套房子,当房子被全部占用时,你的电脑就崩溃了。当然,我们电脑的内存还是很大的。下面来看看字符串、数组、指针之间的关系。
?
字符串以“/0”结束,所以字符串长度要在实际长度上+1
?
数组名就是数组首元素的地址
?
char ch[10] = "asdfg"; //ch[10]是定长数组
?
char ch[] = "asdfg"; //ch[]没有规定长度,但是在定义时必须初始化
?
char *p_ch = "asdfg"; //指针指向字符串的首地址
?
这三种定义字符串的方法差不多。ch和p_ch都是地址。
?
数组定义之后不可改变,指针还可以指向其他地址,但要注意内存泄露。
?
?
9、指针与地址
?
有些书上说指针就是地址,其实这种说法并不准确。
?
那么指针是什么,地址又是什么?
?
首先地址就是地址,物理内存的编号。
?
指针是一个变量,这个变量存放的内容是内存的物理地址。就像int i; i 是一个变量,存放一个 i 值。指针变量也存放一个指针值,这个值是一块物理内存的地址。
?
其实指针是地址还是变量并不影响我们对指针的使用。
?
?
?
10、你用过宏么?
?
#define MAX 60
?
就是MAX = 60;的意思,之后的代码中MAX都等于60。宏使我们的程序维护更简单,也更容易理解。
?
?
?
11、malloc与free
?
有人说new跟delete更强大,但我并这么认为,new和delete是c++中的运算符,提供了对对象的操作。而malloc和free是c语言中用来进行动态内存分配的,不具备可比性。