C指针初步

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 = &num;

	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 = &num;

	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 = &num;
   printf("*p1=%#x\n", *p1);
   short *p2 = &num;
   printf("*p2=%#x\n", *p2);
   char *p3 = &num;
   printf("*p3=%#x\n", *p3);
}
int main(int argc, char *argv[])
{
   test04();
   system("pause");
   return 0;
}

运行结果(0x之后的第一个0被省略):

在这里插入图片描述

内存说明:

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值