C 语言你可能不知道的一些特性
1 定义可变长的数组
#include <stdio.h>
int a[0];//编译器认为这已经有一个元素了,数组大小不能为0
// int a[]; 定义这个也可以不过会出现警告
int function1 ()
{
int i;
int a[5] = {1,2,3,4,5};
for (i = 0; i < 5; i++)
{
printf("a[%d] = %d ",i,a[i]);
}
printf("/n");
}
int function2 ()
{
int i;
int a[6] = {6,2,3,4,5,0};
for (i = 0; i < 6; i++)
{
printf("a[i] = %d ",a[i]);
}
printf("/n");
}
int main ()
{
int i;
function1();
function2();
return 0;
}
a[0] = 1 a[1] = 2 a[2] = 3 a[3] = 4 a[4] = 5
a[0] = 6 a[1] = 2 a[2] = 3 a[3] = 4 a[4] = 5 a[5] = 0
2 柔性数组
#include <stdio.h>
//int c[1] = {10};
//int c[1];
int c[0];
int x = 1;
int main ()
{
struct a_struct {
int i;
int a[0];//变长的数组,不占结构体空间,其实这个成员不应该算做结构体的成员。
}b;
b.i = 5;
b.a[0] = 1;
b.a[1] = 2;
printf("szieof(b) = %d,b.a[0] = %d,sizeof(b.a[0]) = %d/n",sizeof(b),b.a[0],sizeof(b.a));
}
szieof(b) = 4,b.a[0] = 1,sizeof(b.a[0]) = 0
3 数组的地址和数组元素的地址
#include <stdio.h>
int main ()
{
int a[5] = {1,2,3,4,5};
int *ptr1 = (int *)(&a + 1);//&a 数组的地址
// int *ptr2 = (int *)((int *)a+1);//a a[0] 的地址
int *ptr2 = (int *)(a+1);
printf("%x,%x/n",ptr1[-1],*ptr2);
return 0;
}
5,2
4 逗号表达式
#include <stdio.h>
int main ()
{
int i = (1,2);
i = 5, 2+1;
printf("%d/n",i);
}
5
5
/
注意 1:
在编写程序的时候,尽量少用#define,多用typedef。(不绝对的,和程序本身有关,越是大型的程序,越要注意这个)
因为宏定义掌握的不好的话,很容易出现一些预想不到的错误。
比如说:
你写了一个 #define A x
然后再程序里 定义了int A,然后又定义了 int x;(这时你忘了,你已经有一个宏定义,其实int A展开后就是 int x,这样就是重复定义,编译器会报错,这还是好的,编译器会查出来,有些错误是编译器查也查不出来的)
而用typedef对你的程序的可移植性会大大提高。
比如说 你可以定义一个 typedef int INTEGER,这样在程序里INTEGER就代表了int类型,当你的程序要移植时(比如放在64位或者16位的机子上运行时)
那可能你的int类型都要改为long型,这时你就把原来定义的那句改为typedef long INTEGER就可以了,这样就大大增加了程序的可维护性,
所以说对于大型程序typedef还是很有用的,而宏定义却很危险。
注意 2: