c语言的陷阱与缺陷小记

关于c语言的一些小问题
1).为什么n-->0的含义是n- >0,而不是n- ->0?
这个问题基本上可以是运算符的优先级问题,一般单幕运算符
比双目运算符的优先级高,所以应该是n-- >0;
2).a+++++b的含义是什么?
一般是a++之后再加上++b的结果。
const 在C语言之中修饰的变量不可以作为左值变量使用其是只读的变量
但是其本质还是变量,所以const修饰的变量在内存之中会占用一定的内存空间
本质上const只对编译器有用,在运行时其实没有多大的用处,然而既然它是指针
我们可以通过数组的方式来改变其内容
小列1:
#include <stdio.h>
int main()
{
const int mm=0;
int *p=(int *)&mm;
printf("%d\n",mm);
*p=3;
printf("%d\n",mm);
system("pause");
return 0;


}
在外本人在编译这个的时候,,由于粗心的原因
在*p=3这行,误写为p=3,然后我发现这样就无法改变
const修饰的变量的值,这个是为什么呢?
p指针p是指的是p就是变量,*p是地址。
volatile 编译器的警告指示字,告诉编译器每次去内存中取
变量的值,只要修饰可能被多个线程修饰的变量,
修饰可能被未知因素更改的变量
列子:
struct 
空结构体所占 内存的大小是多少呢
这是C99规则并没有规定,一般是一个字节
验证;
#include<stdio.h>
#inlcude<malloc.h>
int main()
{
struct _null n1;
struct _null n2;
printf("%d",sizeof(struct _null));
printf("%d %0x",sizeof(n1),&1);
printf("%d %0x",sizeof(n2),&n2);
return 0;
}
分析如下:
一般使用普通C语言编译器答应的结果出乎意料,基本上是n1和n2的结果全部都是
大小为0,但是首地址确实相同,为什么两个不同的结构体,在内存之中的首地址
是相同的呢,这是编译器的灰色地带,编译器并没有规定结构体的大小是多少。
但是在我使用高级点的编译器之后发现,空结构体的大小是1个字节。两个结构体的首地址也
不相同。
结构体产生的数组
柔性数组就是数组大小待定的数组
代码:
#include <stdio.h>
#include <malloc.h>
typedef struct softarry //typedef 声明类型名代替原来的类型名称


{
int len;
int arry[];//柔性数组,不知道小的数组




}Softarry;
int  mian()
{
int i=0;
Softarry *a=(Softarry)malloc(sizeof(Softarry)+sizeof(int )*10);
a->len=10;
for(i=0;i<a->len;i++)
{
a->arry[i]=i+1;


}
for(i=0;i<a->len;i++)
{


printf("%d",a->arry[i]);
}
free(a);
return 0;
}
剖析:一般来说柔性数组的大小是用户自己在内存的栈之上申请的,大小用户可以自己
硬性规定。
enum 是一种自定义类型 会在默认值的基础上加11
  #include <stdio.h>
  enum Color
  {
    green,
    red,
    blue,
  };
  int main()
  {
   printf("%d",green);
    printf("%d",red);
    printf("%d",blue);
    system("pause");
    return 0;
  }
  enum 是常量在编译器中无法取地址 ;
  enum与define宏定义相比较,define只是进行宏变量的替换,
  不进行内存的分配。
  
 typedef 用于一个给已经存在的类型
 进行重新命名,没产生新的类型,不
 能进行unsigned和signed
#include<stdio.h>
typedef int INT
int mian()
{
int i=0;
int *p=&i;
INT*pp=&i;


return 0;
}  




  
  
  
  
  
  
  
  
  
  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值