1.取地址操作符(&)
我们想要知道某变量的地址时,就可以使用&得到。我们看下面一段代码:
#include<stdio.h>
int main()
{
int a = 1;
printf("%p", &a);
return 0;
}
a变量创建的本质是:
在内存上开辟空间,向内存申请4个字节的空间,存放数据1,且每个字节都有地址,地址如图所示。
变量a在内存中的存储
所以打印出来第一个字节的地址。&a取出来的是a所占四个字节中地址较小的字节的地址。
整型变量占了4个字节,现在我们只知道第一个字节的地址,但是我们可以顺着下去推出该变量其他字节的地址,然后访问到这些地址的数据。
2.指针变量和引用操作符 *
2.1指针变量
指针变量是用来存储地址的,因为地址也是一个数值,后期可能要使用。
#include<stdio.h>
int main()
{
int a = 1;
int* pa=&a;
return 0;
}
取出a的地址存储到指针变量pa中。
我们单看 int* pa=&a
*说明 pa 是指针变量
int 说明 pa 指向的是整型类型对象,也就是a的数据类型
int*是pa的数据类型
2.2引用操作符 *
解引用操作符 * 可以通过指针变量存储的地址找到地址指向的对象。
#include<stdio.h>
int main()
{
int a = 1;
int* pa=&a;
*pa=0;
return 0;
}
*pa=0;这里就用了解引用操作符,通过pa指针变量存储的地址找到了a,所以 *pa就是a,也就是将0赋值给了a。
学习这个之后,我们之后就可以灵活地运用指针变量和解引用操作符解决很多问题了。
3.指针变量大小
32位平台下地址是32个bit位,指针变量⼤⼩是4个字节
64位平台下地址是64个bit位,指针变量⼤⼩是8个字节
🌏指针变量大小与类型无关,只要在相同平台,指针变量大小都相同。
x86环境下的大小
x64环境下的大小
4.指针变量类型意义
(1)指针的类型决定了,指针解引⽤的时候有多⼤的权限(⼀次能操作⼏个字节)。
例如:
char* 的指针解引⽤能访问1个字节,
short* 的指针解引用能访问2个字节。
int* 的指针解引⽤能访问4个字节,
double* 的指针解引用能访问8个字节,
🌏我们来看代码1:
#include<stdio.h>
int main()
{
int a = 112344567;
int* pa=&a;
*pa=0;
return 0;
}
调试
结论:这里的*pa=0会将a的四个字节全都改为0
🌏再看代码2:
#include<stdio.h>
int main()
{
int a = 112344567;
char* pa=(char *)&a;
*pa=0;
return 0;
}
结论:这里的*pa=0只将a的第一个字节改为0
🌏再看代码3:
#include<stdio.h>
int main()
{
int a = 112344567;
char* pa=(char *)&a;
int *pi=&a;
printf("&n=%p\n",&a);
printf("pa=%p\n",pa);
printf("pi=%p\n",pi);
printf("pa+1=%p\n",pa+1);
printf("pi+1=%p\n",pi+1);
return 0;
}
char* 类型的指针变量+1跳过1个字节, int* 类型的指针变量+1跳过4个字节。
结论:指针的类型决定了指针向前或者向后⾛⼀步有多⼤,决定了指针进行+n/-n操作时跳过n个指向值。
5.const修饰指针变量
🌏先看无const修饰的代码
#include<stdio.h>
int main()
{
int n=30;
int m=20;
int *p=&n;
*p=20;
p=&m;
printf("n=%d\n",n);
printf("p=%d\n",*p);
return 0;
}
🌏将代码改成const修饰*左边
#include <stdio.h>
int main()
{
int n = 10;
int m = 20;
const int* p = &n;
*p = 30;
p = &m;
printf("n=%d\n", n);
printf("p=%d\n", *p);
return 0;
}
会报错
结论:const 如果放在 * 的左边,修饰的是指针指向的内容(n),保证指针指向的内容不能通过指针来改变。但是指针变量本⾝的内容( p)可变。
🌏将代码改成const修饰*右边
int main()
{
int n = 10;
int m = 20;
int* const p = &n;
*p = 30;
p = &m;
printf("n=%d\n", n);
printf("p=%d\n", *p);
return 0;
}
报错
结论:const如果放在 * 的右边,修饰的是指针变量本⾝(p),保证了指针变量的内容不能修改,但是指针指向的内容(n),可以通过指针改变。
谢谢阅读,若有不足,望指正,若能帮上各位客官的忙,一键三连吧!