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

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

二维数组:

//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字节对齐,最大的基本数和这个默认要相比较,取最小

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值