C语言-指针进阶

1,指针的理解

2,指针的大小(在32位平台是4个字节,在64位平台是8个字节)

3,指针类型的定义

4,指针类型决定了能访问几个字节

5,野指针成因

6,指针加减整数

7,指针-指针(指针减指针)

8,指针与数组

9,二级指针

10,指针数组

11,用指针模拟数组


1,指针的理解

复制代码
#include<stdio.h>
#include<string.h>
//指针

//指针的理解
int main() {
	int a = 10;//a是整型变量,占用4个字节的内存空间
	int* pa = &a;
	//pa是一个指针变量,用来存放地址的
	//pa

	//本质上指针就是地址
	//口语中说的指针,其实是指针变量,指针变量就是一个变量,指针变量是用来存放地址的一个变量
	return 0;
}

2,指针的大小(在32位平台是4个字节,在64位平台是8个字节)

复制代码
#include<stdio.h>
#include<string.h>
//指针的大小(在32位平台是4个字节,在64位平台是8个字节)
int main() {
	char* pc = NULL;
	short* ps = NULL;
	int* pi = NULL;
	double* pd = NULL;

	//sizeof 返回的值的类型是无符号整型  unsigned int
	printf("%zu\n", sizeof(pc));
	printf("%zu\n", sizeof(ps));
	printf("%zu\n", sizeof(pi));
	printf("%zu\n", sizeof(pd));

	return 0;
}

3,指针类型的定义

复制代码
#include<stdio.h>
#include<string.h>
////指针类型的定义1
//int main() {
//	int a = 0x11223344;
//	int* pa = &a;
//	*pa = 0;
//
//	char* pc = (char*)&a;//int*
//	pc = 0;
//	
//	//结论
//	//指针类型决定了指针在被解引用的时候访问几个字节
//	//如果是int*的指针,解引用访问4个字节
//	//如果是char*的指针,解引用访问1个字节
//	//推广到其他类型
//
//	return 0;
//}
//指针类型的定义2
//100		10进制
//0x64		16进制
//110 0100  2进制
//144		8进制
int main() {
	int a = 0x11223344;
	int* pa = &a;
	char* pc = (char*)&a;
	printf("%d\n", a);
	printf("pa = %p\n", pa);
	printf("pa+1 = %p\n", pa+1);//地址加4字节 

	printf("pc = %p\n", pc);
	printf("pc+1 = %p\n", pc+1);//地址加1字节

	return 0;
}

4,指针类型决定了能访问几个字节

复制代码
#include<stdio.h>
#include<string.h>
//指针类型决定了能访问几个字节
int main() {
	int a = 0;
	int* pi = &a;//pi    解引用访问4个字节,pi+1也是跳过4个字节
	float* pf = &a;//pf  解引用访问4个字节,pi+1也是跳过4个字节
	//但是int*和float*却不可以通用
	//*pi=100;
	*pf = 100.0;
	return 0;
}

5,野指针成因

复制代码
#include<stdio.h>
#include<string.h>
//野指针:指针指向的位置是不可知的(随机的,不准确的,没有明确限制的)
//

//野指针成因
int main() {
	////原因一:未初始化
	//int* p;//局部变量指针未初始化,默认为随机值
	//*p = 20;
	////原因二:指针的越界访问
	//int arr[10] = { 0 };
	//int* p = arr;//&arr[0]
	//int i = 0;
	//for ( i = 0; i <=10; i++)
	//{
	//	*p = i;
	//	p++;
	//}
	//原因三:写入访问权限冲突
	
	//错误写法
	/*int* p2 = NULL;
	*p2 = 100;*/

	//正确写法
	int* p3 = NULL;
	if (p3!=NULL)
	{
		*p3 = 100;//ok
	}
	return 0;
}

//int* test() {
//	int a = 10;
//	return &a;
//}
//int main() {
//	int* p = test();
//	printf("haha\n");
//	printf("abcdef\n");
//	if (p!=NULL)
//	{
//		printf("%d\n", *p);//指针虽然还指向原来的地方,但是已经不属于你了,如果别人使用那么内容就会改变
//		//例如执行完printf("haha\n");printf("abcdef\n");后,值就会改变
//	}
//	return 0;
//}

6,指针加减整数

复制代码
#include<stdio.h>
#include<string.h>
//指针加减整数
int main() {
	int arr[10] = { 0 };
	int i = 0;
	int sz = sizeof(arr) / sizeof(arr[0]);

	//int* p = arr;
	//for ( i = 0; i < sz; i++)
	//{
	//	*p = 1;
	//	p++;
	//}
	//上面for循环的另一种写法
	for ( i = 0; i < sz; i++)
	{
		*(p + i) = 1;
	}
	return 0;
}

7,指针-指针(指针减指针)

复制代码
#include<stdio.h>
#include<string.h>
//指针-指针(不是所有指针都能相减,只有指向同一空间的指针才能相减)
//得到的是:指针和指针之间的个数
//int main() {
//	int arr[10] = { 0 };
//	printf("%d\n", &arr[9] - &arr[0]);
//	return 0;
//}

//指针减指针的应用
//自制strlen函数
//方法一
//int my_strlen(char* str) {
//	int count = 0;
//	while (*str!='\n') {
//		count++;
//		str++;
//	}
//	return count;
//}
//方法二:递归的版本
//方法三:指针减指针
int my_strlen(char* str) {
	char* start = str;
	while (*str != '\n') {
		str++;
	}
	return (str-start);
}
int main() {
	int len = my_strlen("abcdef");
	printf("%d\n", len);
	return 0;
}

8,指针与数组

复制代码
#include<stdio.h>
#include<string.h>
//指针与数组
//int main() {
//	int arr[10] = { 0 };
//	//arr 是首元素的地址
//	//&arr[0]
//	int* p = arr;
//	//通过指针来访问数组
//	int sz = sizeof(arr) / sizeof(arr[0]);
//	int i = 0;
//	for ( i = 0; i < sz; i++)
//	{
//		printf("%p  %p  %p\n", &arr[i], p + i, arr + i);//三种结果完全相同
//	}
//
//	return 0;
//}
//指针与数组举例二
//
void test(int *p,int sz) {
	int i = 0;
	for ( i = 0; i < sz; i++)
	{
		printf("%d ", *(p + i));
	}
}
void test(int arr[], int sz) {
	int i = 0;
	for (i = 0; i < sz; i++)
	{
		printf("%d ", arr[i]);
	}
}
int main() {
	int arr[10] = { 0 };
	test(arr, 10);
	return 0;
}

9,二级指针

复制代码
#include<stdio.h>
#include<string.h>
//二级指针
int main() {
	int a = 10;
	int* pa = &a;//pa是一个指针变量,一级指针变量
	int** ppa = &pa;//ppa是一个二级指针变量

	//*pa = 20;
	//printf("%d\n", a);
	return 0;
}

10,指针数组

复制代码
#include<stdio.h>
#include<string.h>
//指针数组
//存放指针的数组就是指针数组
int main() {
	int a = 10;
	int b = 20;
	int c = 30;

	int arr[10];

	int* pa = &a;
	int* pb = &b;
	int* pc = &c;
	
	int* parr[10] = { &a,&b,&c };
	int i = 0;
	for ( i = 0; i < 3; i++)
	{
		printf("%d ", *(parr[i]));
	}
	return 0;
}

11,用指针模拟数组

复制代码
#include<stdio.h>
#include<string.h>
//用指针模拟数组
int main() {
	//int arr[3][4] = { 1,2,3,4,2,3,4,5,3,4,5,6 };
	//int i = 0;
	//int j = 0;
	//for ( i = 0; i < 3; i++)
	//{
	//	for ( j = 0; j < 4; j++)
	//	{
	//		printf("%d ", arr[i][j]);
	//	}
	//	printf("\n");
	//}

	//和上面的效果一么一样
	int arr1[4] = { 1,2,3,4 };
	int arr2[4] = { 2,3,4,5 };
	int arr3[4] = { 3,4,5,6 };

	int* parr[3] = { arr1,arr2,arr3 };
	int i = 0;
	for ( i = 0; i < 3; i++)
	{
		  int j = 0; 
		for ( j = 0; j < 4; j++)
		{
			printf("%d ", parr[i][j]);
		}
		printf("\n");
	}

	return 0;
}
相关推荐
白太岁1 小时前
操作系统开发:(11) RTOS 与 GPOS 的分界线:MMU
c语言·开发语言·汇编·arm开发·系统架构
lly2024061 小时前
Vue3 目录结构
开发语言
Java后端的Ai之路1 小时前
在一个 Python 脚本中导入另一个脚本的功能
服务器·开发语言·python
W133309089072 小时前
高职大数据技术专业,CDA和Python认证优先考哪个?
大数据·开发语言·python
三无少女指南2 小时前
开发者环境配置最佳实践:编辑器Cursor ,VS Code的上位体验实现 AI 与 WSL 联动
运维·c语言·数据库·windows·git·编辑器
kyle~2 小时前
Python---watchdog文件系统监控库
开发语言·python·操作系统·文件系统
开开心心就好2 小时前
文字转语音无字数限,对接微软接口比付费爽
java·linux·开发语言·人工智能·pdf·语音识别
xyq20242 小时前
Perl 发送邮件:全面指南
开发语言
cui_ruicheng2 小时前
C++ 继承(下):多继承、菱形继承与虚继承
开发语言·c++