C语言复习笔记(五)指针&结构体

第五章 指针&结构体

上一章传送门函数

指针变量

1.指针变量的定义
指针变量是用来存储地址的,而一般变量存储数值的。指针变量可指向任意一种数据类型,但不管它指向的数据占用多少字节,一个指针变量占用四个字节。格式为:类型名 *指针变量名。二维指针int **p;可以理解为基类型为(int *)类型。
如:int *p,*t;

2.指针变量的初始化指针变量在使用前必须要初始化,把一个具体的地址赋给它,否则引用时会有副作用,如果不指向任何数据就赋“空值”NULL

如:int *p,a=1;p=&a;         //p和&a表示变量a的地址,*p和a表示变量a的值

3.指针变量的引用&是取地址符,*是间接访问运算符,它们是互逆的两个运算符。在指针变量名前加间接访问运算符就等价它所指向的量。

**4.**指针的运算*p++和(*p)++之间的差别:*p++是地址变化,(*p)++是指针变量所指的数据变化。一个指针变量加一个整数不是简单的数学相加,而是连续移动若干地址。当两个指针指向同一数组时,它们可以比较大小进行减法运算

5.①数组名代表数组的首地址,也就是数组中第0号元素的地址
②如果指针变量p已指向数组中的一个元素,则p+1指向同一数组中的下一个元素

怎样引用指针变量

例:输入a和b两个整数,按先大后小的顺序输出a和b。
解题思路:不交换整型变量的值,而是交换两个指针变量的值(即a和b的地址)。

#include <stdio.h>
int main()
{	int *p1,*p2,*p,a,b;					//p1,p2的类型是int *类型
	printf("please enter two integer numbers:");
	scanf("%d,%d",&a,&b);				//输入两个整数 
	p1=&a;							//使p1指向变量a
	p2=&b;							//使p2指向变量b
	if(a<b)							//如果a<b
	{	p=p1;p1=p2;p2=p;}			//使p1与p2的值互换
	printf("a=%d,b=%d\n",a,b);			//输出a,b
	printf("max=%d,min=%d\n",*p1,*p2);	//输出p1和p2所指向的变量的值
	return 0;
}

在这里插入图片描述
注意:
a和b的值并未交换,它们仍保持原值,但p1和p2的值改变了。
实际上,第9行可以改为{p1=&b; p2=&a;}即直接对p1和p2赋以新值,这样可以不必定义中间变量p,使程序更加简练。
在这里插入图片描述

这个是二维数组任意元素地址和值的关系,很多人看题看不懂,把这个背一下,很有用。

在这里插入图片描述在这里插入图片描述

指向由m个元素组成的一维数组的指针变量

例:输出二维数组任一行任一列元素的值。

#include <stdio.h>
int main()
{	int a[3][4]={1,3,5,7,9,11,13,15,17,19,21,23};		//定义二维数组a并初始化
	int (*p)[4],i,j;			//指针变量p指向包含4个整型元素的一维数组
	p=a;					//p指向二维数组的0行
	printf("please enter row and colum:");
	scanf("%d,%d",&i,&j);	//输入要求输出的元素的行列号
	printf("a[%d,%d]=%d\n",i,j,*(*(p+i)+j));			//输出a[i][j]的值
	return 0;
}

在这里插入图片描述
**比较: **
① int a[4];(a有4个元素,每个元素为整型)
② int (*p)[4];
第②种形式表示(*p)有4个元素,每个元素为整型。也就是p所指的对象是有4个整型元素的数组,即p是指向一维数组的指针,见图。应该记住,此时p只能指向一个包含4个元素的一维数组,不能指向一维数组中的某一元素。p的值是该一维数组的起始地址。虽然这个地址(指纯地址)与该一维数组首元素的地址相同,但它们的基类型是不同的。

#include <stdio.h>
int main()
{	int a[4]={1,3,5,7};		//定义一维数组a,包含4个元素
	int (*p)[4];			//定义指向包含4个元素的一维数组的指针变量中
	p=&a;				//使p指向一维数组
	printf("%d\n",(*p)[3]);	//输出a[3],输出整数7
	return 0;
}

在这里插入图片描述
在这里插入图片描述

定义结构体类型变量

定义结构体变量一共有三种形式:
1.先声明结构体类型,再定义该类型的变量

struct Student
{	int num;				//学号为整型 
	char name[20];		//姓名为字符串 
	char sex;			//性别为字符型 
	int age;				//年龄为整型
	float score;			//成绩为实型 
	char addr[30];		//地址为字符串 
};	//注意分号

2.在声明类型的同时定义变量

struct Student
{	int num;		
	char name[20];
	char sex;	
	int age;
	float score;
	char addr[30];
}student1, student2;

在这里插入图片描述
3. 不指定类型名而直接定义结构体类型变量

struct Student  student1, student2;
	|			     |	    |
结构体类型名	       结构体变量名

在这里插入图片描述
在这里插入图片描述

结构体变量的初始化和引用

例:把一个学生的信息(包括学号、姓名、性别、住址)放在一个结构体变量中,然后输出这个学生的信息。

#include <stdio.h>
int main()
{	struct Student							//声明结构体类型struct Student
	{	long int num;						//以下4行为结构体的成员
		char name[20];
		char sex;
		char addr[20];
	}a={10101,"Li Lin",'M',"123 Beijing Road"};	//定义结构体变量a并初始化
	printf("NO.:%ld\nname:%s\nsex:%c\naddress:%s\n",a.num,a.name,a.sex,a.addr);
	return 0;
}

在这里插入图片描述

注意

在这里插入图片描述
在这里插入图片描述

  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值