0
点赞
收藏
分享

微信扫一扫

C语言----初阶指针

young_d807 2022-01-31 阅读 78

目录

一. 指针是什么

1.指针变量

2.如何编址?

二. 指针和指针类型

三. 野指针

3.1 野指针成因

3.2 如何规避野指针

四. 指针运算

4.1指针加减整数

4.2指针减指针

4.3指针的关系运算

五. 指针和数组

六. 二级指针

七. 指针数组


 

一. 指针是什么

1)指针是内存中一个最小单元的编号,也就是地址
2)平时口语中说的指针,通常指的是指针变量,是用来存放内存地址的变量
总结:指针就是地址,口语中说的指针通常指的是指针变量

1.指针变量

2.如何编址?

二. 指针和指针类型

#include <stdio.h>
//演示实例
int main()
{
   int n = 10;
   char *pc = (char*)&n;
   int *pi = &n;
   printf("%p\n", pc);
   printf("%p\n", pc+1);
   printf("%p\n", pi);
   printf("%p\n", pi+1);
   return 0;
}
int main()
{
	int arr[10] = { 0 };
	//如果希望按照一个整型的形式访问
	int* p = arr;
	int i = 0;
	for (i = 0; i < 10; i++)
	{
		*p = 0x11223344;
		p++;
	}
	//假设你希望,你访问这个40个字节的时候,是以字节为单位访问
	char* p = (char*)arr;//int*
	int i = 0;
	for (i = 0; i < 40; i++)
	{
		*p = 'x';
		p++;
	}
	return 0;
}

三. 野指针

3.1 野指针成因

1. 指针未初始化

2.指针越界使用

3.指针指向空间释放

 p继承了a已经销毁的地址,所以p为野指针

3.2 如何规避野指针

1. 指针初始化
2. 小心指针越界(不操作,仅仅指向外部某条件)
3. 指针指向空间释放即使置NULL(零地址数向下一段空间用户不能访问)
4. 避免返回局部变量的地址
5. 指针使用之前检查有效性

四. 指针运算

4.1指针加减整数

#define N_VALUES 5
float values[N_VALUES];
float *vp;
//指针+-整数;指针的关系运算
for (vp = &values[0]; vp < &values[N_VALUES];)
{
*vp++ = 0;
}

4.2指针减指针

int main()
{
	int arr[10] = { 0 };

	printf("%d\n", &arr[0] - &arr[9]);

	return 0;
}

4.3指针的关系运算

五. 指针和数组

#include <stdio.h>
int main()
{
   int arr[10] = {1,2,3,4,5,6,7,8,9,0};
   printf("%p\n", arr);
   printf("%p\n", &arr[0]);
   return 0;
}

数组名:首元素地址

int main()
{
	int arr[10] = { 0 };
	printf("%p\n", arr);
	printf("%p\n", arr+1);
	printf("%p\n", &arr[0]);
	printf("%p\n", &arr[0]+1);
	printf("%p\n", &arr);
	printf("%p\n", &arr+1);
	return 0;
}
输出:
0133F840  +4
0133F844
0133F840  +4
0133F844
0133F840  +28
0133F868

六. 二级指针

int main()
{
	int a = 10;
	int* pa = &a;//pa是指针变量(一级指针)
	int** ppa = &pa;//ppa是一个二级指针
	int*** pppa = &ppa;//pppa就是三级指针
	return 0;
}


七. 指针数组

int main()
{
	int data1[] = { 1,2,3,4,5 };
	int data2[] = { 2,3,4,5,6 };
	int data3[] = { 3,4,5,6,7 };

	//arr就是一个指针数组
	int* arr[3] = { data1 ,data2, data3 };
	int i = 0;
	for (i = 0; i < 3; i++)
	{
		int j = 0;
		for (j = 0; j < 5; j++)
		{
			printf("%d ", arr[i][j]);
		}
		printf("\n");
	}

	return 0;
}
举报

相关推荐

0 条评论