C语言的指南针——指针与结构体

本文深入探讨了C语言中的指针和结构体。从指针的定义、类型、引用、运算,到野指针的成因及避免方法,详细阐述了指针在数组和结构体中的应用。同时,讲解了结构体的定义、初始化、访问及结构体指针的使用,通过实例展示了如何操作结构体和指针,帮助读者掌握C语言中这两重要概念。
摘要由CSDN通过智能技术生成

⭐️前面的话⭐️

📒博客主页:未见花闻的博客主页
🎉欢迎关注🔎点赞👍收藏⭐️留言📝
📌本文由未见花闻原创,CSDN首发!
✉️坚持和努力一定能换来诗与远方!
💬参考在线编程网站:🌐牛客网🌐力扣
博主的码云gitee,平常博主写的程序代码都在里面。
博主的github,平常博主写的程序代码都在里面。
🙏作者水平很有限,如果发现错误,一定要及时告知作者哦!感谢感谢!


1.一分钟搞懂指针是什么

如果在程序中定义了一个变量,在对程序进行编译时,系统就会给这个变量分配内存单元。编译系统根据程序中定义的变量类型,分配一定长度的空间。内存区的每一个字节有一个编号,这就是“地址”。
由于通过地址能找到所需的变量单元,可以说,地址指向该变量单元,将地址形象化地称为“指针”。

#include <stdio.h>
int main()
{
   
 int a = 10;//在内存中开辟一块空间
 int *p = &a;//这里我们对变量a,取出它的地址,可以使用&操作符。
   //将a的地址存放在p变量中,p就是一个之指针变量。
 return 0; }

对于一个变量我们可以使用取地址符&获取这个变量的地址,对一个指针使用解引用符*可以访问指针所指向的那块空间。

int arr[10] = {
    1,2,3,4,5,6,7,8,9,0 };

比如一个数组,它的每个元素都有一个指向其元素的地址。数组名通常指该数组首元素的地址(指针)。

储存单元的地址(指针) 储存单元的内容
0x00EFFB30 01 00 00 00
0x00EFFB34 02 00 00 00
0x00EFFB38 03 00 00 00
0x00EFFB3C 04 00 00 00
0x00EFFB40 05 00 00 00
0x00EFFB44 06 00 00 00
0x00EFFB48 07 00 00 00
0x00EFFB4C 08 00 00 00
0x00EFFB50 09 00 00 00
0x00EFFB54 00 00 00 00

C语言中的地址包括位置信息(内存编号,或称纯地址)和它所指向的数据的类型信息,或者说它是“带类型的地址”。
存储单元的地址和存储单元的内容是两个不同的概念。
在程序中一般是通过变量名来引用变量的值。
直接按变量名进行的访问,称为“直接访问”方式。

//直接访问
arr[0];
arr[2];
//...

还可以采用另一种称为“间接访问”的方式,即将变量的地址存放在另一变量(指针变量)中,然后通过该指针变量来找到对应变量的地址,从而访问变量。

//间接访问
*(arr);//arr[0]
*(arr+2);//arr[2]

2.指针

2.1指针类型

指针和变量一样有不同种类的类型,变量有字符型,整型,浮点型…;指针也有字符型指针,整型指针,浮点型指针…
char*:字符指针类型,指向数据类型为字符型的指针
int*:整型指针类型,指向数据类型为整型的指针
double*:双精度浮点型指针。
float*:单精度浮点型指针。
unsigned int*:无符号整型指针。
int (*arr)[10]:数组指针,指向一个数组的指针。
使用指针类型定义的变量称为指针变量。如,

int* a = 8;
double* b = 8.6;
char* ch = 'A';

像上面所定义的变量a b ch就称为指针变量。
正如上举例所示定义指针变量的格式就是类型名 * 变量名;
对于指针变量的定义,要注意以下几点:
💡 指针变量前面的*表示该变量为指针型变量。指针变量名则不包含*
💡 在定义指针变量时必须指定基类型。一个变量的指针的含义包括两个方面,一是以存储单元编号表示的纯地址(如编号为2000的字节),一是它指向的存储单元的数据类型(如int,char,float等)。
💡 如何表示指针类型。指向整型数据的指针类型表示为“int *”,读作“指向int的指针”或简称“int指针”。
💡 指针变量中只能存放地址(指针),不要将一个整数赋给一个指针变量。

2.2指针变量的引用

了解指针类型,那指针能干什么呢?
① 给指针变量赋值
②引用指针变量指向的变量
③引用指针变量的值

int a  = 8;
int *p = NULL;
p=&a;				//把a的地址赋给指针变量p										        ①
printf("%d\n",*p);	//以整数形式输出指针变量p所指向的变量的值,即a的值			            ②
*p=1;				//将整数1赋给p当前所指向的变量,由于p指向变量a,相当于把1赋给a,即a=1	②
printf("%p\n",p);		//以输出指针变量p的值,由于p指向a,相当于输出a的地址,即&a	③

例题:
输入a和b两个整数,不交换a,b变量的值,通过交换a,b地址的方式实现按先大后小的顺序输出a和b。

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
   
	int* p1 = NULL;
	int* p2 = NULL;
	int* p = NULL;						//p1,p2,p的类型是int *类型
	int a = 0;
	int b = 0;					
	printf("请输入两个整数:\n");
	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)
  • 25
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 18
    评论
评论 18
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

未见花闻

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值