⭐️前面的话⭐️
📒博客主页:未见花闻的博客主页
🎉欢迎关注🔎点赞👍收藏⭐️留言📝
📌本文由未见花闻原创,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)