文章目录
1.指针
在内存空间中,每个字节都对应有一个编号,这个编号即为“地址”。也称“编指”。
一个变量可能占据多个字节,不论变量占了多少个字节,我们平时说的变量的地址,一般都指的是变量的起始地址。
一个变量的地址,也可以称为这个变量的指针。
1.1 指针变量
指针变量是一种特殊类型的变量,它存储了一个内存地址。这个内存地址可以指向另一个变量的位置。换句话说,指针变量存储了其他变量的内存地址,而不是直接存储变量的值。
只有指针变量才可以存地址。指针变量是特殊类型的变量,而并非常存储地址的常规变量。
指针的本质,是间接访问。
指针 和 指针变量 不是同一个东西。
在64位应用程序中,寻址范围是8字节,即指针大小为8字节。
在32位应用程序中,寻址范围是4字节,即指针大小为4字节。
(考试时一般会说明程序的位数)
1.2 直接访问与间接访问
在C语言中,直接访问 和 间接访问 是指访问内存中存储数据的两种不同方式。
直接访问是指按变量地址存取变量的方式。
(也可以描述为:通过 使用变量名 来直接访问该变量所在位置的值。)
例如,如果有一个整型变量x,可以直接使用x来访问其存储的整数值。
间接访问 是 通过使用指针 来访问变量所在位置的值。指针是存储变量地址的特殊变量类型。通过使用指针,可以间接地访问指针指向的变量的值。
定义指针变量的时候,在前边加一个*,表示定义的是指针变量,如:
int *num=100;
1.3 代码示例
试用代码进行举例举例:
先定义一个整型变量
num
,并给其赋值为10。
再定义一个指针变量ptr
,并将以变量num
的地址&num
为值,对ptr其赋值。
(指针变量名是ptr
,而不是*ptr
。)
ptr
前边的*,表示ptr
是一个指针变量。同时,*
也是取值运算符。
因此,可以理解为,这里一共涉及了二个变量:
变量num
的值为10,变量ptr
的值为变量num
的地址。
且通过对ptr
使用*
运算符,可以间接得到变量num
的值。
#include <stdio.h>
int main() {
int num = 10;
int *ptr = #
printf("num=%d\n", num); // 直接访问
printf("ptr=%d\n", ptr);
printf("*ptr=%d\n", *ptr); // 间接访问
printf("sizeof ptr=%d\n", sizeof(ptr)); //查看指针所占空间大小
return 0;
}
输出结果:
num=10
ptr=6422036
*ptr=10
sizeof ptr=8
要点:
①定义指针变量时,一定要保持类型一致:整型变量的值复制给整型指针;字符变量的值赋值给字符指针。
②连续定义多个指针变量:int *a,*b,*c
,而不能写成int *a,b,c
。
③指针变量的值,必须是地址,不能是随随便便的一个其他类型的值。
2.指针变量的应用场景
指针变量的使用场景主要在于传递与偏移。
认识指针变量的使用场景,更有利于加深对指针变量的理解。
2.1 传递
以下述代码为例,先说明一下值传递。
需求:定义一个变量i
,和一个change
函数。要求change
函数可以实现修改变量i
的值。
#include <stdio.h>
void change(int j){
j=5;
}
int main() {
int i=10;
printf("before change i=%d\n",i)