一、 数组指针
1. 二维数组的传参:
int a[2][3] = {1, 2, 3, 4, 5};
int fun(int (*p)[3], int len);
注:排序时不能交换地址
e.g.用二维数组传参完成接收打印函数时,被调函数的第一个参数类型应该时数组指针类型,其他操作与数组的操作一致
1 #include <stdio.h>
2
3 int InputArray(int (*p)[3], int len)
4 {
5 int i = 0;
6 int j = 0;
7
8 for(j = 0; j < len; j++)
9 {
10 for(i = 0; i < 3; i++)
11 {
12 scanf("%d", &p[j][i]);
13 }
14 }
15
16 return 0;
17 }
18
19 int OutputArray(int (*p)[3], int len)
20 {
21 int i = 0;
22 int j = 0;
23 for(j = 0; j < len; j++)
24 {
25 for(i = 0; i < 3; i++)
26 {
27 printf("%d ", p[j][i]);
28 }
29
30 printf("\n");
31 }
32
33 return 0;
34 }
35
36 int main(void)
37 {
38 int a[2][3] = {0};
39
40 InputArray(a, 2);
41 OutputArray(a, 2);
42
43 return 0;
44 }
2.指针数组的传参
char *pstr[5] = {NULL};
int fun(char **ppstr, int len);
e.g.用指针数组传参完成排序时被调函数类型应该为char **型,其他操作与数组操作时无差别,要注意接收时用的时数组str,操作和打印时用的是pstr,操作过程中str元素不变,这样大大提高了效率
#include <stdio.h>
#include <string.h>
int InputArray(char (*p)[32], int len)
{
int i = 0;
for (i = 0; i < len; i++)
{
gets(p[i]);
}
return 0;
}
int SortArray(char **ppstr, int len)
{
int j = 0;
int i = 0;
char *ptmp = NULL;
for (j = 0; j < len-1; j++)
{
for (i = 0; i < len-1-j; i++)
{
if (strcmp(ppstr[i], ppstr[i+1]) > 0)
{
ptmp = ppstr[i];
ppstr[i] = ppstr[i+1];
ppstr[i+1] = ptmp;
}
}
}
return 0;
}
int OutputArray(char **ppstr, int len)
{
int i = 0;
for (i = 0; i < len; i++)
{
printf("%s\n", ppstr[i]);
}
return 0;
}
int OutputArray2(char (*p)[32], int len)
{
int i = 0;
for (i = 0; i < len; i++)
{
printf("%s\n", p[i]);
}
return 0;
}
int main(void)
{
char str[5][32] = {0};
char *pstr[5] = {str[0], str[1], str[2], str[3], str[4]};
InputArray(str, 5);
SortArray(pstr, 5);
OutputArray(pstr, 5);
printf("=================\n");
OutputArray2(str, 5);
return 0;
}
二、 void *指针
void *p;
p = (void *)a
注:void *指针主要用来保存内存地址
void* 转换为char *、int *、double * 类型时,不需要类型转换,直接赋值就行
char *、int *、double *转换为void *类型时,需要强制类型转换
void *多用于函数参数和返回值,统一参数和返回值类型
三、构造数据类型
1. 结构体
(1)类型定义
struct 结构体名 {
数据类型1 成员变量1;
数据类型2 成员变量2;
数据类型3 成员变量3;
...
};
(2)结构体变量定义
存储类型 数据类型 变量名;
(3) 结构体元素初始化
全部初始化:struct student stu = {"zhangsan", 'm', 18, 90};
局部初始化:
struct student stu = {
.name = {"zhangsan"},
.score = 90,
};(注意分号和逗号都是必须的)
注:没有给定初值的元素都被赋值为0
(4)结构体成员访问
. :结构体变量类型访问成员变量 .
-> :结构体指针类型访问成员变量 ->
结构体访问成员变量最终的类型由成员变量的类
e.g.
1 #include <stdio.h>
2 #include <string.h>
3
4 struct student
5 {
6 char name[32];
7 char sex;
8 int age;
9 int score;
10 };
11
12 int main(void)
13 {
14 struct student s;
15 struct student *ps = NULL;
16
17 ps = &s;
18 gets(ps->name);
19 scanf("%c", &ps->sex);
20 scanf("%d", &ps->age);
21 scanf("%d", &ps->score);
22
23 printf("%s %c %d %d\n", ps->name, ps->sex, ps->age, ps->score);
24
25 return 0;
26 }
(5)结构体的存储
结构体成员必须存放在内存地址为自身类型长度整数倍的内存单元中
结构体的大小必须为自身最大类型长度的整数倍
比如:struct student {
char name[32];
char sex;
int age;
int score;
};
这个结构体就占了44个字节
(6)结构体传参
传值:void fun(struct student tmp);
传地址:void fun(struct student *ptmp);(常用)
e.g.mesmset的作用是对指针初始化清零
1 #include <stdio.h>
2 #include <string.h>
3
4 struct student{
5 char name[32];
6 char sex;
7 int age;
8 int score;
9 };
10
11 void GetStuInfoByPoint(struct student *pstu)
12 {
13 gets(pstu->name);
14 scanf("%c",&pstu->sex);
15 scanf("%d",&pstu->age);
16 scanf("%d",&pstu->score);
17
18 return;
19 }
20
21 void PutStuInfoByPoint(struct student *pstu)
22 {
23 printf("%s %c %d %d\n",pstu->name,pstu->sex,pstu->age,pstu->score);
24
25 return;
26 }
27 int main(void)
28 {
29 struct student ret;
30
31 memset(&ret, 0, sizeof(ret));
32
33 GetStuInfoByPoint(&ret);
34 PutStuInfoByPoint(&ret);
35
36 return 0;
37 }

被折叠的 条评论
为什么被折叠?



