C 语言

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:

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值