第五章 指针&结构体
上一章传送门:函数
指针变量
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;
}