C语言代码实例

本文是关于C语言的代码实例,涉及结构体、枚举、位运算、指针、内存对齐、数据类型转换等多个核心知识点的讲解,包括结构体的动态内存分配、数组和指针的关系、位运算符的逻辑和算术区别、静态局部变量的使用等。
摘要由CSDN通过智能技术生成

#include <stdio.h>
#include <stdlib.h>
#include <string.h>/* 包含了使用字符串函数的所需的原型和声明,便于程序执行错误检查 */
#include <math.h>
typedef struct
{  int len;
   int len1;
   char data[0];//不占用内存空间,会在后面连续的分配一块内存空间使用,和指针区别开来
}SS1;

typedef struct
{  int len;
   int len1;
   int data[1];//占用内存空间,会在后面连续的分配一块内存空间使用,和指针区别开来
}SS2;

typedef struct
{  int len;
   int len1;
   char *data;//不占用内存空间,会在后面连续的分配一块内存空间使用,和指针区别开来
}SS3;

typedef struct
{  char len;
   int len1;
   char data;
}W0;

typedef struct
{  char len;
   char len1;
   int data;
}W1;

typedef struct
{  int len;
   char len1;
   short data;
   double data1;
   int len2;
}W2;

//#pragma pack(2)

/*结构体数据类型的对齐规则如下(常见陷阱)

1.数据类型自身的对齐值:

对于char型数据,其自身对齐值为1,对于short型为2,对于int,float,double类型,其自身对齐值为4,单位字节。

2.结构体或者类的自身对齐值:其成员中自身对齐值最大的那个值。

3.指定对齐值:#pragma pack (value)时的指定对齐值value。

4.数据成员、结构体和类的有效对齐值:自身对齐值和指定对齐值中小的那个值。

*/

#pragma pack(2)/* 设置2字节对齐 */
typedef struct

   char len1;
   long int data1;
   int len2;
}W3,*b;
#pragma pack() /* 取消指定对齐,恢复缺省对齐(4字节对齐) */

typedef enum
{
 Sunday,
 Monday,
 Tuesday,
 Wednesday,
 Thursday,
 Friday,
 Saturday //尾部不能有逗号
}weekday;


void testarr(int *m);
void teststatic();
void Show(short n);

void testarr(int *m)
{
 printf("arr name m1 = %d\n", sizeof(m));
}

void teststatic()
{
 static int n=10;
 printf("n = %d\n", n);
 n++;
 
}


void Show(short n) {
short i;
printf("%d(",n);
for(i = 0; i < 16; ++i)
printf("%d",(n & (1 << (15 - i))) >> (15 - i));
printf(")B\n");
}


int main(int argc, char **argv)
{
 
 #if 0
 /*1.C语言的输入和输出函数的用法*/
 printf("--------------------------1------------------------------\n");
 int a[10] = {0};
 //a++;
 printf("a=%d\n",a[0]);
 //printf("a=%d\n",a);
 //printf("a=%d\n",&a);
 
 int b = 0;
 scanf("%d",&b);
 printf("%d\n",b);
 

 /*2.利用结构体定义变长数组和指针的对比*/
 printf("--------------------------2------------------------------\n");
 typedef struct
 {  int len;
    int data[0];
 }SS;
 
 SS sa;//结构体相关的局部变量初始化,不初始化后面的数据是一个随机值
 //SS sa={0};
 memset(&sa,0,sizeof(SS));//清空以上结构体中的随机值
 printf("sizeof(SS)=%d\n",sizeof(SS));
 printf("len=%d\n",sa.len);
 printf("data=%d\n",sa.data[0]);
 
 sa.len = 10;
 sa.data[0] = 80;
 sa.data[10] = 80;
 sa.data[20] = 80;
 sa.data[50] = 80;
 sa.data[60] = 80;
 sa.data[65] = 80;
 sa.data[66] = 80;//到了67就不行了
 
 printf("len = %d\n",sa.len);
 printf("data0 = %d\n",sa.data[0]);
 printf("data10 = %d\n",sa.data[10]);
 printf("data20 = %d\n",sa.data[20]);
 printf("data50 = %d\n",sa.data[50]);
 printf("data60 = %d\n",sa.data[60]);
 printf("data60 = %d\n",sa.data[65]);
 printf("data60 = %d\n",sa.data[66]);
 printf("sizeof(SS) = %d\n",sizeof(SS));
 printf("sizeof(sa)

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值