C指针初步
1 数据类型的理解
1.1 为啥要用数据类型
数据类型的本质作用是为了合理的利用空间,
char占一个字节,int占四个字节:
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
void test01()
{
//基本类型char short int long float double
//char占一字节空间
char ch;
printf("%d\n",sizeof(ch)); //输出1
//int占四字节空间
int num;
printf("%d\n", sizeof(num)); //输出4
}
int main(int argc, char *argv[])
{
test01();
system("pause");
return 0;
}
1B=8b(二进制位) 即一个字节等于8个比特
1b只能存放0或1
1.2 数据占用与内存的图示
2 指针与内存
2.1 内存
内存是沟通CPU与硬盘的桥梁,有两个概念:
- 物理存储器:内存条上的芯片
- 存储地址空间:对存储器编码的范围,这是软件工程师关心的
2.2 内存地址
将内存条抽象成很大的一维字符数组,然后对每一个字节分配一个号码,相当于门牌号,这种号码是32位或者64位的,一般是0x…,然后我们就把编号称之为内存地址,这个时候我们再引如数据类型,什么char啊,int什么的,由于前文当中提到的char是占一个字节,int占四个字节,也就是说这个时候char占1个门牌,int占4个门牌。但是我们一般说的内存地址都只有一个0x…,如果是char还好,因为它就只有一个内存地址,该是啥就是啥,但是int就不一样了,它占用四个字节,由上述来说它有四个”门牌号“,如下图所示,那么究竟哪一个是它的内存地址呢?
实际上,我们取这四个字节中的首个字节的"门牌号"作为内存地址:
取某一个变量在内存中的代码:
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
void test02()
{
int num = 100;
//& 用于取地址
printf("%p\n", &num);//结果为00F9FAC4 不同设备不同时间不一样
}
int main(int argc, char *argv[])
{
test02();
system("pause");
return 0;
}
2.2 指针变量
定义一个变量(此时它会在内存当中占用一个位置),它里面存储的不是常见的什么阿拉伯数字(诸如1,2,3等),而是存”门牌号“,也就是内存地址0x…,这个时候我们把这个变量叫做指针变量,简称指针,所以指针其实也是变量,只不过这个变量保存的是内存地址,我们在定义指针变量的时候有点不同,我们用:
int *p=Null; //加个*代表指针变量
2.3 指针的初步使用
下面是对指针的初步使用的理解,请注意:
- 指针是如何取到内存地址的值的?
- *在不同地方出现的时候有什么意义?
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
void test02()
{
int num = 100;
printf("%p\n", &num);
//需求:定义一个指针变量,保存num的地址
int *p = NULL;//*在定义的时候表示一种对指针变量的声明
printf("sizeof(p)=%d\n", p);
//用p获取到地址
p = #
printf("直接打印num=%d\n", num);
printf("通过指针打印num=%d\n",*p);//*在使用的时候表示对指针保存的内存地址所对应的变量内容
}
int main(int argc, char *argv[])
{
test02();
system("pause");
return 0;
}
2.3 指针变量的两种类型
2.3.1 指向自身的类型
就是说定义的指针是什么类型的,方法是在定义指针的时候,我们把变量名忽略,剩下的是啥类型指针变量就是啥类型,比如下面的指针p就是int *类型
int *p=NULL//这个指针p是int *类型的
2.3.2 指向的类型
就是说它指向的那块区域(存储的内存地址所在区域)是什么类型的,方法是在定义指针的时候,我们把变量名和离它最近的*忽略,剩下的是啥类型指针指向的就是啥类型,比如下面的指针p就是指向int 类型
int *p=NULL//这个指针p指向int类型的
指针指向类型的作用:
- 决定了指针变量+1跳过的跨度,具体见下面的代码
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
void test03()
{
int num = 120;
int *p = NULL;
p = #
printf("&num=%u\n", &num);
printf("p=%u\n", p);
printf("p+1=%u\n", p + 1);
}
int main(int argc, char *argv[])
{
test03();
system("pause");
return 0;
}
运行结果:
说明:可以看见p和&num的值是一样的,那么为什么p+1是比p多了4呢,其实是因为p指向的是int类型占用四个字节,p+1代表的是地址加了4,这个1代表的是单位,由于它指向的是int,所以1个单位应该等于4个字节,如下图所示
- 指针指向类型的作用,决定的是指针变量所取空间内容的宽度,详见代码
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
void test04()
{
int num = 0x01020304;
int *p1 = #
printf("*p1=%#x\n", *p1);
short *p2 = #
printf("*p2=%#x\n", *p2);
char *p3 = #
printf("*p3=%#x\n", *p3);
}
int main(int argc, char *argv[])
{
test04();
system("pause");
return 0;
}
运行结果(0x之后的第一个0被省略):
内存说明: