二维数组与字符串与结构体

指针

指针中的const

int const * p; //不能改变指针指向的值
int * const p; //不能改变指针指向的地址
int const * const p //既不能改变值,也不能改变地址

结构体

知识提要

1.传向函数的结构体数组都是指针

2.[]的优先级比*高

3.指针的运算符是-> 而结构体的运算符是.

struct instr
{   char ina1[10];
    int ina2[10];
};
struct str
{   char a[10];
    int b[10];
    double c[10];
    struct instr instrin;
    {
        char b1[10];
        int b2;
    };
};
struct str stru;
struct str *pstru=&stru;
1.结构体写法   stru.a[i];
stru.instrin.ina1[i];
stru.b2;
2.指针        pstru->a[i];
            (*pstru).a[i];
pstru->instrin.ina2;
pstru->b2;

结构体

定义模板
struct name
{   char fname[10];
    char lname[10];
};
定义结构体变量
struct name myname;
函数定义
void print_sour(struct name myname);   //函数定义中的形参是一个结构体,需要传入一个结构体
函数调用
print_sour(myname); //这儿传递的是一整个结构的所有数据

结构体指针, 注意:在函数调用上要与上面的分开

定义模板
struct money
{
    double hand_money;
    double save_money;
}
struct name
{ 
    struct money mymoney;     //嵌套结构体必须要有;
    char fname[10];
    char lname[10];
    {
        int num1;
        double num2;
    };      //匿名结构体也需要;
};
定义结构体指针
struct name myname_c;
struct name *myname;
结构体指针的使用
myname=&myname_c;       //对于结构体,结构体不是数组,结构体的名字不代表地址,要用取地址符
printf("%s",myname->fname);     //myname代表一个结构体指针,用->
printf("%s",(*myname).fname)    //(*myname)代表一个结构体,用.

printf("%lf",myname->money.hand_money); //myname->money相当于一个结构体,后续的成员用.
printf("%d",myname->num1);      //匿名结构体相当于外层结构体的成员
函数定义
void printf_sour(struct name *myname); //函数定义中形参是个结构体指针,需要传入一个结构体的地址
函数调用
printf_sour(&myname);  //这儿传递的是一个结构体的地址

结构体数组

定义模板
struct name
{   char fname[10];
    char lname[10];
};
定义结构体数组
struct name myname[5];
函数定义,  两种写法没有区别,传过去的都是结构体指针
void printf_sour(struct name myname[]);     定义形式1
void printf_sour(struct name *myname);      定义形式2
函数调用
printf_sour(myname);    //myname是一个数组,名称即代表地址
printf_sour(&myname[0]);    //myname[0]是一个结构体,要加取地址符,取得地址

字符串的输入

一维字符串

char str[100];
//scanf("%s",str);
//注意!,scanf的%s遇到,空格,tab键,回车会认为输入结束
//不能输入i love you这种有空格的字符串

//gets(str);
//fgets(str,99,stdin);

二维字符串

//输入7*7方阵,每行要8个空,7个字符,1个空字符
char str[7][8];
int i=0;
for(i=0;i<n;i++)
{
    scanf("%s",str[i]);
    //fgets(str[i],7,stdin);
}
for(i=0;i<n;i++)
{
    printf("%s\n",str[i]);
}

指针传输数值

//目的,获取一个数组内最大值与最小值
函数定义
int tomm(int num[],int n,int *max,int *min);
主函数内调用
int min,max;
tomm(num,n,&max,&min);

一维数组

知识提要

1.传向函数的数组都是指针

定义
int num[10]={0};
函数定义
void print_sour(int num[],int n); //常用写法
void print_sour(int *num,int n); //不常用写法,本质写法    
数组个数需要传入
函数调用
print_sour(num,10);

二维数组

知识提要

1.传向函数的数组都是指针

2.[]的优先级比*高

int (*pz)[3]
这是一个指针,指针+数组,即为指向一个内含3个int值的数组的指针
int *pz[3]
这是一个数组,数组+指针,即为pz是三个元素的数组,每个元素是个指针

*int (pz)[3]的另一种写法是
int pz[][3],这是一般写法,这个指向数组的指针用来声明二维数组的函数形参

二维数组

行数rows 列数cols

定义
int num[rows][cols]={"1,2,3,4,5","1,2,3,4,5","1,2,3,4,5","1,2,3,4,5","1,2,3,4,5"};
函数定义
void print_sour(int num[][cols],int n); //只能省略第一个括号数组     
行号需要传入,列数内置
函数调用
print_sour(num,rows);

二维变长数组定义

int n,m;
int num[n][m];
二维变长数组不可编译前初始化,要初始化只能for循环初始化

二维变长数组函数调用

定义
int num[5][5]={"1,2,3,4,5","1,2,3,4,5","1,2,3,4,5","1,2,3,4,5","1,2,3,4,5"};
函数定义
void print_sour(int n,int m,int num[n][m]);
函数调用
print_sour(5,5,num);

二维字符串

二维字符串数组,用法和二维数组一样

#define lim 100
定义
char str[5][lim]={"abcdefg","wangboyang","blues str","wby wby wby","qwer asdf zxcv"};
函数定义
void print_sour(char str[][lim]);
函数调用
print_sour(str);

二维字符串指针

#define SIZE 5
定义
char *str[SIZE]={"abcdefg","wangboyang","blues str","wby wby wby","qwer asdf zxcv"};
函数定义
void print_sour(char* str[SIZE]);
函数调用
print_sour(str);