C语言的灵魂——深入理解指针(1)

1.内存

C语言中给地址取名叫:指针

我们可以理解为: 内存单元的编号 == 地址 == 指针
CPU和内存之间也是有⼤量的数据交互的,他们两者之间的牵线叫做地址总线
#include
int main()
{
    int a = 20;
    return 0;
}

 创建变量的本质是向内存申请空间,比如变量a申请了(整形int)4个字节的空间,每个字节都有编号(地址),编译器是通过地址找内存单元的。

 2.指针变量及其地址

 首先我们得认识两个符号:

&  --取地址符号 -- 拿到指针变量的地址

*   --解引用符号 -- 通过地址找到指针变量所指向空间

#include 
int main()
{
	int a = 10;
	int* p = &a;
//* 是在说明pa是指针变量
//前⾯的 int 是在说明pa指向的是整型(int)类型的对象。
	printf("%d\n", *p);
//*pa 的意思就是通过pa中存放的地址,找到指向的空间,*pa其实就是a变量
//*p = 0;//显然这里代表a被重新赋值为0
	return 0;
}

//那么指针变量的大小取决于地址的大小
//VS2022 x86环境即32位平台下地址是32个bit位(即4个字节)
//VS2022 x64环境即64位平台下地址是64个bit位(即8个字节)

//	printf("%zu\n", sizeof(int*));
//	printf("%zu\n", sizeof(char*));
//	printf("%zu\n", sizeof(float*));
//	printf("%zu\n", sizeof(double*));

//输出的结果都是一样的,得出结论:指针变量的大小跟类型是无关的

 3.指针变量的类型和意义

//代码1
#include 
int main()
{
int n = 0x11223344;
int *pi = &n;
*pi = 0;
return 0;
}

//代码2
//int main()
//{
//int n = 0x11223344;
//char *pc = (char *)&n;
//*pc = 0;
//return 0;
//}

//代码1会将n的4个字节全部改为0,但是代码2只是将n的第⼀个字节改为0
//结论:指针的类型决定了对指针解引⽤的时候有多⼤的权限(即⼀次能操作⼏个字节)
//⽐如:char* 的指针解引⽤就只能访问⼀个字节,⽽ int* 的指针的解引⽤就能访问四个字节

int main()
{
int n = 10;
char *pc = (char*)&n;
int *pi = &n;
printf("%p\n", &n);
printf("%p\n", pc);
printf("%p\n", pc+1);
printf("%p\n", pi);
printf("%p\n", pi+1);
return 0;
}

//调试结果如下:
//008FFBF4
//008FFBF4
//008FFBF5
//008FFBF4
//008FFBF8
//结论:指针的类型决定了指针向前或想后移动多大距离

 void* 指针也叫⽆具体类型的指针(或者叫泛型指针)

 void* 类型的指针可以接收不同类型的地址,但是⽆法直接进⾏指针+-运算及解引用

⼀般 void* 类型的指针是使⽤在函数参数的部分,⽤来接收不同类型数据的地址

 4.指针运算

指针的基本运算有三种,分别是:
  •  指针+- 整数
  • 指针-指针
  • 指针的关系运算
#include 

//指针+- 整数
//int main()
//{
//	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
//	int sz = sizeof(arr) / sizeof(arr[0]);
//	int* p = arr;//获取数组的首元素地址,也可写成int* p = &arr[0];
//	int i = 0;
//	for (i = 0; i < sz; i++)
//	{
        //*(p+i)这⾥就是指针+整数
//		printf("%d ", *(p+i));//通过循环打印数组,使用指针的性质
//	}
//	return 0;
//}

//指针-指针
//int My_strlen(char* arr)
//{
//		char* p = arr;//两个指针同时指向char类型的arr数组 
//		while (*p != '\0')
//		{
//			p++;
//		}
//		return p - arr;这⾥就是指针-指针
//两个指针相减结果的绝对值是它们之间的元素个数
//所以它的计算前提两个指针同时指向同一地址        
//}
//int main()
//{
//	char arr[] = "abcdef";
//	printf("%d\n",My_strlen(arr));
//	return 0;
//}

//指针的关系运算
int main()
{
	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
	int* p = &arr[0];
	int sz = sizeof(arr) / sizeof(arr[0]);
	while (p < arr + sz)//指针的大小比较,指针p小于arr+sz,后者指向'\0'
	{
		printf("%d ", *p);
		p++;
	}
	return 0;
}

 未完待续.......

 

 

 

 

你可能感兴趣的:(c语言,开发语言)