二维数组

1定义

               类型 + 数组名 + [常量表达式][常量表达式]

例如:

               int a[2][3]    float b[3][4]【前面代表第一维【2】后面代表第2维【3】】

2引用

               数组名 [下标][下标]

例如:

               a[4][3]

二维数组的初始化

(1)分行给二维数组赋初值(定义的时候赋值) int a[3][4] = {{1,2,3,4},{5,6,7,8},{9,10,11,12}};

(2)将所有的数组放在一个括号内 int a[3][4] = {1,2,3,4,5,6,7,8,9,10,11,12};【和上面意思一样】

(3)对部分元素赋值 int a[3][3] = {{1},{5},{9}}; 是对每一行的第一列元素赋值,未赋值的元素取0值,赋值后各元素的值为: 1 0 0 5 0 0 9 0 0

4)如果对全部的元素赋值,则定义时候对第一维的长度可以不指定,而第二维的长度不能够省。

int a[3][4] = {1,2,3,4,5,6,7,8,9,10,11,12}; 等价于: int a[][4] = {1,2,3,4,5,6,7,8,9,10,11,12};

二维数组名及地址 数组名是第一个元素的首地址 第一维数组相当于第二维的数组名

a + i:        第i+1个一维数组的地址
*(a + i):    第i+1个一维数组首元素的地址
*(a+i)+j:    第i+1个一维数组的第j+1个元素的地址

二重指针

二重指针一般用的场合:

(1)二重指针指向一重指针的地址。

#include<stdio.h> int main() { int a = 10; int *P1; int **P2; P1 = &a; P2 = &P1; return 0; }

(2)二重指针指向指针数组的地址。

#include<stdio.h> int main() { int *a[4]; int **p; p = a; }

结构体

意义

在C语言中,可以使用结构体(Struct)来存放一组不同类型的数据。结构体的定义形式为:

形式

struct 结构体名 { 结构体所包含的变量或数组 };

结构体的初始化:

struct infor
{ char name[50];
char is_male; int age; };

struct infor s1 = {“name”,’0’,3}; //完全初始化

struct infor s2 = {.age = 1}; struct infor s2 = {“name”}; //部分初始化

给结构体成员赋值

    strcpy(s1.name,shai ");

    s1.is_male = 1;

    s1.age = 17;

读取结构体成员的值

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

相同结构体变量之间可以互相赋值:

struct infor
{ char name[50];
char is_male; int age; }s1,s2;

s1.age = 2 ;

s2 = s1 ;

                 字节对齐

struct str1 // 7 { int a; // 4 char b; // 1 + 1 short c; // 2 }s1; // 8

struct str2 { char a; // 1 char b; // 1 // + 2
int c; // 4 }s2; // 8

struct str3 // 6 { int a; char b; char c; // + 2 }s3; // 8 struct str4 { char a; short b; short c; }s4 //6 1、 结构体变量的地址是从4字节对齐的未知开始(0、4、8、C) 2、各成员在结构体里自身要对齐; 3、成员之间不满足自身对齐,得填充(padding) 4、满足结构体自身对齐的最小倍数 5、默认是4字节对齐,最大的基本数据类型和这个默认值要相比较,取其小 0 