指针
文章目录
1.什么是指针?
指针就是用来存放地址的。
我国的国土面积大,但人均占有少,合理分配极为重要。
以一栋楼房为例子,一层10户,5层便是50户。送外卖若是只知道目标在这一栋中,而无门牌号及其他的信息,只能挨家挨户的找过去,无用的消耗巨大。
若是有门牌号及详细的地址信息,便可省去不必要的麻烦,即可节约时间减少占用。
本章节对的指针亦是如此。
内存会划分一个个的内存单元(一个内存单元的大小为:1byte)
每个内存单元都有一个编号
以电脑的内存例子:
以32位的电脑为例,电脑要去访问这个内存空间,要生成地址,
32位的电脑在生成地址的时候。硬件的电路就要生成地址,
地址线(通电的时候就会产生电信号)
1/0(正脉冲/负脉冲)
如果说32位机器上,有32跟地址线,每根地址线上都有电信号,如下图
此时电脑具有的内存大小
换算为GB时的大小:
2.获取一个整数的位置
2.1定义一个整型的变量,并用&地址符获取地址
使用取地址符“&”获取指针地址
打印指针
a的地址就是当前4个字节中的第一地址,首地址
假设a被分到了5、6、7、8,4个字节的空间,那么a将会在5的位置被存储起来
2.2监视获取a的地址
调试——>逐语句——>逐过程
调试——>窗口——>监视——>添加要监视的项(输入a和&a),获取a的值和a的地址
2.3内存查看a的信息
调试——>窗口——>内存,输入a的地址或(&a),来获取a所占用的内存信息
2.4 a的内存占用解析
使用一列可以看到4个地址的另外三个00 00 00分别是39 3A 3B(十六进制的)
其中0a 00 00 00,分别代表了4个字符中的一个字符。
内存中是倒着存的十六进制,如果是二进制的10太麻烦了,就写成16进制了。
3.使用%p打印a的地址
使用%p打印a的地址,地址的类型是int*
# define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main() {
int a = 10;//向内存申请4个字节(int的大小)存储10
//&a;//地址符&,获取a的地址
printf("%p\n", &a);
int* p = &a;//地址的数据类型是int*,这时候的p就是指针变量
printf("%p\n", p);
}//输出:a的地址
3.2使用*p修改对象的值
**是解应用操作符,意思是通过p中存放的地址,找到p所指向的对象,p就是p所指向的对象
例子中是通过a的指针变量p,通过*p找到a的值,并修改为20.
*p = 20;//*是解应用操作符,意思是通过p中存放的地址,找到p所指向的对象,*p就是p所指向的对象
printf("%d", a);
同时,&a和*p都是单目操作符
4.指针变量的大小
都是指针变量大小一样,在需要不同的空间的时候不一样。
# define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main() {
//不管是什么类型的指针都是在创建指针变量
//指针变量是用来存放地址的
//指针变量的大小取决于一个地址存放的时候需要多大的空间
//32位机器上的地址:32bit-4byte,所以指针的大小是4个字节
//64位机器上的地址:64bit-8byte,所以指针的大小是8个字节
printf("%zu\n", sizeof (int*));
printf("%zu\n", sizeof (short*));
printf("%zu\n", sizeof (long*));
printf("%zu\n", sizeof (float*));
printf("%zu\n", sizeof (double));
printf("%zu\n", sizeof (char* ));
//左上角的X86就是32位bit,X64就是64位bit,可以调节查看指针变量大小的变化
return 0;
}
5.多个指针
int * p = &a;
int* p = &b;//两种之间的空格不一样,但是没有什么区别
int* p,a,b;//这三个变量中只有p是指针变量,其他的两个都是int类型的变量
int *p,*a,*b;//这样的三个才都是指针变量
4.简单来说
内存单元——>编号——>指针——>地址也被称为指针
所以存放地址或指针的变量称为指针变量(所以上方的int* b = &a;就是指针变量)
一般讲p是指针,其实就是p是指针变量
int * p,int说明p指向的对象是int类型的,*说明p是指针变量
同理:
char z = "w";
char* q = &z;//char 说明q指向的对象是char类型的