十、指针
🎈使用&
取地址
对于scanf 将输入的值传给一个变量 那么要加上&
符号
scanf("%d",&i);
C语言的变量是放在内存中的 每个变量都有个地址 地址就是变量在内存中所存放的地方的位置
而&
符号 就能够获取到指定变量的地址 它是C语言中的取地址符
获取变量的地址 它的操作数必须是变量 而不能对没有地址的取地址
使用%p
来输出地址:
int i=0;
printf("%p\n",&i);
地址的大小取决于编译器和系统是32位还是64位架构
相邻的变量的地址
同时定义的两个变量 它们在内存中的地址位置也是紧挨着的 是相邻的
int i1;
int i2;
printf("%p\n",&i1); // 0061FECC
printf("%p\n",&i2); // 0061FEC8
这是因为 在堆栈中 内存是自顶向下分配的 因此先定义的变量会在上面(即地址值更高)
数组的地址
数组的引用和数组的取地址是一样的 都是数组的地址
数组的地址使用的是数组中第一项(也就是下标为0)的地址
且数组中的每一项之间都是相邻的 紧贴着的
int i[10];
printf("%p\n",&i); // 0061FEA8
printf("%p\n",i); // 0061FEA8
printf("%p\n",&i[0]); // 0061FEA8
printf("%p\n",&i[1]); // 0061FEAC
printf("%p\n",&i[2]); // 0061FEB0
🎈指针变量
将取得的变量的地址传递给一个函数 那么可以通过该地址在那个函数内访问这个变量
【指针】 是一种变量的类型
指针类型的变量就是专门用于保存地址的变量
下面是一个简单的例子:
将int类型的变量 i 的地址交给了指针p
int*中的*
代表这是一个指针 int
表示该指针指向的是int
int i;
int* p=&i;
p里保存的是变量i的地址 那么 可以说是p指向i
🚩指针变量
星号*可以靠近类型 也可以靠近变量名
因此 并不是将星号加给了int这个类型 而是加给了距离星号最近的那个变量名
int* a,b; // 此时 a是指针类型 而b只是普通的int类型
int *a,b; // 此时 a是指针类型 而b只是普通的int类型
在C中并没有int*这个类型
🚩指针变量的特点
在普通的变量中 存放的是实际的值
而在指针变量中 不会存放实际的值 存放的是具有实际的值的变量的地址
🚩指针作为参数
在指针作为参数的时候 用void f(int *p);
来定义
在调用的时候 要这么传入:
int i=123;
f(&i); // 传入的是int类型的变量的【引用】而不是原本的变量名或值
🚩访问指针地址上的变量
若要访问 也很简单 只需要使用星号即可
当然 星号若作为双目运算符 那么是乘的意思
但作为单目运算符 用于访问指针的值所表示的地址上的变量
#include <stdio.h>
void f(int *p);
int main()
{
int i=123;
printf("%p\n",&i); // 0061FECC
f(&i);
return 0;
}
void f(int *p)
{
printf("%p\n",p); // 0061FECC
printf("%d",*p); // 123