c语言(13)—指针(3)数据结构(1)

一、 数组指针

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 }

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值