在C语言中,凡不加返回值类型限定的函数,就会被编译器作为返回整型值处理。
定义const 是只读变量,具有不可变性。const 修饰的只读变量必须在定义的同时初始化。编译器通常不为普通const 只读变量分配存储空间,而是将它们保存在符号表中,这使得它成为一个编译期间的值,没有了存储与读内存的操作,使得它的效率也很高。
/*…*/这种形式的注释不能嵌套,如:
/*这是/*非法的*/*/
因为/*总是与离它最近的*/匹配。
注意:斜杠(/)和星号(*)之间没有空格,否则表示“除以”和“指针”。
int *p = NULL;
这时候我们可以通过编译器查看p 的值为0x00000000。这句代码的意思是:定义一个指针
变量p,其指向的内存里面保存的是int 类型的数据;在定义变量p 的同时把p 的值设置为
0x00000000,而不是把*p 的值设置为0x00000000。这个过程叫做初始化,是在编译的时候
进行的。
int *p;
*p = NULL;
同样,我们可以在编译器上调试这两行代码。第一行代码,定义了一个指针变量p,其指向
的内存里面保存的是int 类型的数据;但是这时候变量p 本身的值是多少不得而知,也就是
说现在变量p 保存的有可能是一个非法的地址。第二行代码,给*p 赋值为NULL,即给p
指向的内存赋值为NULL;但是由于p 指向的内存可能是非法的,所以调试的时候编译器可
能会报告一个内存访问错误。这样的话,我们可以把上面的代码改写改写,使p 指向一块合
法的内存:
int i = 10;
int *p = &i;
*p = NULL;
在编译器上调试一下,我们发现p 指向的内存由原来的10 变为0 了;而p 本身的值, 即内
存地址并没有改变。
经过上面的分析,相信你已经明白它们之间的区别了。不过这里还有一个问题需要注
意,也就是这个NULL。初学者往往在这里犯错误。
注意NULL 就是NULL,它被宏定义为0:
a 和&a 的区别
main()
{
int a[5]={1,2,3,4,5};
int *ptr=(int *)(&a+1);
printf("%d,%d",*(a+1),*(ptr-1));
}
对指针进行加1 操作,得到的是下一个元素的地址,而不是原有地址值直接加1。所以,
一个类型为T 的指针的移动,以sizeof(T) 为移动单位。因此,对上题来说,a 是一个一
维数组,数组中有5 个元素; ptr 是一个int 型的指针。
&a + 1: 取数组a 的首地址,该地址的值加上sizeof(a) 的值,即&a + 5*sizeof(int),也
就是下一个数组的首地址,显然当前指针已经越过了数组的界限。
(int *)(&a+1): 则是把上一步计算出来的地址,强制转换为int * 类型,赋值给ptr。
*(a+1): a,&a 的值是一样的,但意思不一样,a 是数组首元素的首地址,也就是a[0]的
首地址,&a 是数组的首地址,a+1 是数组下一元素的首地址,即a[1]的首地址,而&a+1 是下一
个数组的首地址。所以*(a+1)输出2,而*(&a+1)输出a[5]数组里的值(当然这里已经越界了)。
*(ptr-1): 因为ptr 是指向a[5],并且ptr 是int * 类型,所以*(ptr-1) 是指向a[4] ,
输出5。
指针数组和数组指针
指针数组:首先它是一个数组,数组的元素都是指针,数组占多少个字节由数组本身
决定。它是“储存指针的数组”的简称。数组名为p1,int *修饰的是数组的内容。
数组指针:首先它是一个指针,它指向一个数组。是“指向数组的指针”的简称。数组在这里并没有名字,是个匿名数组。int 修饰的是数组的内容,
0表示正常退出,其他表示非正常退出,一般都用-1或者1,
exit(1);//跟return(1)一样效果;
标准C里有EXIT_SUCCESS和EXIT_FAILURE两个宏,用exit(EXIT_SUCCESS),可读性比较好一点。
使用exit()时,可以不论main()的返回值类型。
它的头文件是 stdlib.h。
用exit退出后,可以查看程序退出的状态。
程序执行完后用echo $? 看退出状态。
exit(0) 为0;
exit(1) 为1;
continue 是跳出出本次循环,继续下一次循环。
break 是跳出循环。不再执行该循环。
exit(0) 及 exit(1) 對程式的結束並無影響,
其不同處在於,
exit(0) 會在程式結束後傳回 0 到 DOS .
exit(1) 會在程式結束後傳回 1 到 DOS .
當然... 不只如此, 也可以寫成 exit(10), exit(1000) 等等..
所以不能說 exit(0) 就是程式正常結束, exit(1) 是不正常結束,
這只是大家習慣用法而已, 不是一定的~
程式結束後傳給 dos 的值, 可以使用 bat 檔來讀取,
判斷程式是否正確執行...
如果沒記錯, 是使用 errorlevel 指令來判斷..
continue只是直接执行下一次循环,其循环内部continue后面语句不执行。
而break则是跳出该循环,执行该循环后面的程序。