2017/12/19C语言笔记整理

来源:互联网 发布:开淘宝店一个月能赚多少钱 编辑:程序博客网 时间:2024/05/29 13:23

###############################################################################

二维数组:

//int arr[2][3]={{1,2,3},{4,5,6}};

//数组名是数组第一个元素的首地址,也就是arr==&arr[0]

 arr[0]是二维的数组名,也就是arr[0]==&arr[0][0]

 arr[0][0]是元素

//一重指针和二维数组匹配

 int *p=arr[0];

 p++;p->arr[0][1];

//数组指针和二维数组匹配

 int *p1[3]=arr; 数组指针

 int*p[2]={arr[0],arr[1]};  指针数组p[0]==arr[0]

//二重指针:指向的对象是一个指针,该指针指向一个int型数据。

 int **p=arr  //不匹配 原因:例如:p+1(偏移8字节)=arr+1(偏移12个字节)

 int **p,*p1; //定义指针

//绑定

 int a=23;

 p1=&a;

 p=&p1;

################################################################################

结构体:是一种数据结构,解决了数组里不能存放多种数据类型的数据这种问题。

//基本数据结构(int flost char ~~~),数组是一种数据结构(缺点:元素单一)

#include <stdio.h>

#include <stdlib.h>

#include <sring.h>

struct infor   //structinfor 是标识符,必须整体使用

{

   charname[50]; //元素成员变量属性

   char is_male;

   int age;   

}; //分号坚决不能少

//定义了一个内存,不占空间。

typedef struct infor S;

int main(void)

{

   Printf(“sizeof(S)=%d.\n”,sizeof(S));//输出56表示类型所占字节的大小

   /*

   //定义了一个结构体变量,有变量才会分配空间。

   //定义并且初始化

  S s={“~~”1,1}

  //遍历元素,运算符(.)是专用于结构体变量访问个元素

  printf(“结构体变量元素:%d %d%s”,s.is_male,s.age,s.name);

  */

  /*

  S s1;

  //赋值个成员//(.)符号访问到结构体的成员变量名//数组名不能作为左值

  strcpy(s1.name,"mm");

   s1.is_male=1;

   s1.age=17;

   return 0;

  */

   //初始化和数组很像,挨个进行赋值

   Ss2={1,2}//(,0,0)

   printf("结构体元素:%s %d %d",s2.name,s2.is_male,s2.age);

   Ss3={1,2,3}//s2

   //初始化

   Ss5={.age=27,.name={"~~"}};

   printf("数组里的元素为:%s %d %d",s5.name,s5.is_male,s5.age);//~~ 027

}

//struct

//struct data

{

   int a;

   float b;

   char c;

}s;//这个s是变量名的意思;定义类型的同时给出了结构体的变量名。

int main(void)

{

   s.a=1;

   s.b=3.14;

   s.c=2;

}

struct st

{

   int a;

   float b;

   char c;

};//结构体类型 

int main(void)

{

   //该类型的变量

   struct st s;

   s.a=1;

   s.b=3.14;

   s.c=2;

//结构体里.的实质

   int*p_a=&s.a;

//&s的类型是struct st *

   int *p_a=(int*)&s;

   printf("*p_a=%d",*p_a);//1

   float*p_b=(float *)((char *)&s+4);//将地址转化成char *类型==float *p_b=(float *)((long)&s+4);//分析:将地址值转化为数字,加上几就是加上几

   printf("*p_b=%.2f",*p_b);

   char*p_c=(char *)((char *)&s+8);

   printf("*p_c=%c",*p_c);

   struct st s1;

   s1=s;//相同结构体之间可以互相赋值,在C++里有个称呼叫做:赋值构造。

}

void set_value_func(struct st arr[],int lenth)

{

   int i=0;

   for(i=0;i<lenth;i++)

   {

       scanf("%d",&arr[i].a);

       scanf("%f",&arr[i].b);

       scanf("%c",&arr[i].c);

   }

}

void show_infor_func(struct st arr[],int lenth)

{

   int i=0;

   for(i=0;i<lenth;i++)

   {

       printf("%d%f %c\n",arr[i].a,arr[i].b,arr[i].c);

   }

}

int main(void)

{

   struct starr[3];

   set_value_func(arr,3);

   show_infor_func(arr,3);

   return 0;  

}

//结构体指针

struct st

{

   int a;

   float b;

   char c;

};

void func(struct st *p)

{

   p->a=1;

   p->b=3.14;

   p->c=2;

}

int main(void)

{

   struct st s;

   struct st*p=&s;

   func(p);//调用函数赋值

   ==struct sts; func(&s);

}

//结构体的指针对齐规则

struct str1

{

   int a;

   char b;

   short c;

}S1;//8

struct str2

{

   char a;

   char b;

   int c;

}S2;//8

struct str3

{

   int a;

   char b;

   char c;

}S3;//8

struct str4

{

   struct str1s;

   char a;

   short b

}S4;//12

typedef struct str5

{

   int a;

   char b;

}ST,*P_ST;

//STstruct str5的类型名P_STstructstr5*类型的别名

int main(void)

{

   ST s1;

   P_ST p;

   p=&s1;

   return 0;

}

struct str6

{

   char a;

   int b;

}s,*p=&s;

//sstruct str6的变量名,p是此结构体的指针变量名

struct str7

{

   char ab;

   short a[2];

}S7;//6

//1.结构体变量的地址是从四字节对齐的位置开始(0,4,8c

 2.各成员在结构体里自身要对齐

   char0 12 3 ···

   int0 48 c···

   short0 24···

 3.成员之间不满足自身对齐需要填充(padding

 4.满足结构体自身对齐的最小倍数

 5.默认是4字节对齐,最大的基本数和这个默认要相比较,取最小