二维数组与字符串与结构体
指针
指针中的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);