什么是指针?

指针的概念

内存区的每一个字节有一个编号,这就是地址

由于通过地址能够找到所需的变量单元,地址指向该变量单元

地址形象化的的称为指针

指针就是指向内存单元的变量,它指向内存单元的地址,通过指针可以访问到内存单元中的数据

alt text

alt text

所以我们可以理解为:内存单元的编号=地址=指针

指针是一种数据类型,用来存储变量的地址。

指针的作用

指针的作用主要有以下几点:

  1. 访问内存中的数据:指针可以直接访问内存单元中的数据,因此可以提高程序的运行效率。

  2. 传递参数:指针可以作为函数的参数,用来传递数组、字符串、结构体等地址。

在程序中一般通过变量名来访问变量,但是指针可以直接访问内存单元中的数据,因此可以提高程序的运行效率。

#include <stdio.h>
void _swap(int a, int b)
{
int temp=a;
a=b;
b=temp;
}
int main(void)
{
int a=5,b=10;
_swap(a,b);
printf("a=%d b=%d",a,b);
return 0;
}

alt text

在这一段代码运行下来发现,输出的结果a还是等于5,b还是等于10,他们的值并没有交换.

原因是:在函数_swap中,a和b的值被临时保存到temp中,然后a的值被b的值覆盖,b的值被temp的值覆盖,但是main函数中的a,b并没有发生变化。

为了解决这个问题,我们需要用到指针,通过指针来访问内存单元中的数据,而不是通过变量名来访问。

#include <stdio.h>
void _swap(int *a, int *b)
{
int temp=*a;
*a=*b;
*b=temp;
}
int main(void)
{
int a=5,b=10;
_swap(&a,&b);
printf("a=%d b=%d",a,b);
return 0;
}

alt text

指针变量

指针变量是一种变量,用来存储指针的地址。

指针变量可以用来指向其他变量,也可以用来指向数组、字符串、结构体等。

指针的定义:

int *p; // 定义一个整型指针变量p

指针的初始化:

int a = 10;
int *p = &a; // 指针p指向变量a的地址

指针的运算:

int a = 10;
int b = 20;
int *p = &a; // 指针p指向变量a的地址
int *q = &b; // 指针q指向变量b的地址
int *r = p + 1; // 指针r指向变量a的下一个地址
int *s = p - 1; // 指针s指向变量a的上一个地址

指针的赋值:

int a = 10;
int b = 20;
int *p = &a; // 指针p指向变量a的地址
int *q = &b; // 指针q指向变量b的地址
*p = *q; // 指针p指向变量b的地址

指针的运算

指针的运算可以用来访问数组元素、字符串元素、结构体成员等。

int a[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
int *p = a; // 指针p指向数组a的第一个元素
int *q = p + 5; // 指针q指向数组a的第六个元素
int *r = p - 2; // 指针r指向数组a的第三个元素

指针的赋值可以用来修改变量的值、数组元素的值、字符串元素的值、结构体成员的值等。

int a = 10;
int b = 20;
int *p = &a; // 指针p指向变量a的地址
*p = b; // 指针p指向变量b的地址

指针的比较可以用来判断两个指针是否指向同一个地址。

int a = 10;
int b = 20;
int *p = &a; // 指针p指向变量a的地址
int *q = &b; // 指针q指向变量b的地址
if (p == q) // 判断指针p和指针q是否指向同一个地址
printf("p and q point to the same address\n");
else
printf("p and q point to different addresses\n");

指针的类型转换可以用来将指针转换为其他类型的指针。

int a = 10;
int *p = &a; // 指针p指向变量a的地址
char *q = (char *)p; // 指针q指向变量a的地址,类型转换为char型指针

指针的数组可以用来访问数组元素。

int a[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
int *p[10]; // 定义10个指针变量
for (int i = 0; i < 10; i++)
p[i] = a + i; // 指针p[i]指向数组a的第i个元素

P223: 例8.2-输入a和b两个整数,按先大后小的顺序输出a和b

alt text
alt text
alt text

P226: 例8.4-对输入的两个整数按大小顺序输出

alt text
alt text
alt text
alt text

在引用数组元素是指针的运算:

指针已指向一个数组元素是,可以对指针进行以下运算:

加一个整数(用 +或 +=),如 p+1;

减一个整数(用 -或 -=),如 p-1;

自加运算,如 p++ 和 ++p;

自减运算,如 p-- 和 --p。

两个指针相减,如p1-p2(只有当p1p2指向同一个数组元素时才有意义)。

分别说明如下

  1. 如果指针变量p已指向数组中的一个元素,则p+1指向同一个数组中的下一个元素,p-1指向同一个数组中的前一个元素。例如:
int a[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
int *p = a; // 指针p指向数组a的第一个元素
int *q = p + 5; // 指针q指向数组a的第六个元素
int *r = p - 2; // 指针r指向数组a的第三个元素

2.如果p的初值为&a[0] ,则p+i 和 a+i就是数组元素a[i]的地址,或者说,它们指向a数组序号为i的元素。例如:

int a[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
int *p = &a[0]; // 指针p指向数组a的第一个元素
int *q = p + 5; // 指针q指向数组a的第六个元素
int *r = p - 2; // 指针r指向数组a的第三个元素
  1. 如果指针变量p1和p2指向同一个数组元素,则p1-p2表示两个指针之间的距离,即p1指向的元素距离p2指向的元素有多少个元素。
  1. *(p+i):表示指针p指向的地址加上i个元素的地址,即*(p+i)表示*(p+0)*(p+1)*(p+2)…。
  2. *(p-i):表示指针p指向的地址减去i个元素的地址,即*(p-i)表示*(p-10)*(p-9)*(p-8)…。
  3. *(p+i)*(p-i)都可以用来访问数组元素。