c语言-指针进阶

文章目录


前言

在c语言基础已经介绍过关于指针的概念和基本使用,本篇文章进一步介绍c语言中关于指针的应用。


一、字符指针

字符指针是指向字符的指针。

结果分析:

"abcedf"是一个常量字符串

p是一个指向常量字符串的指针

因为常量字符串不可被修改,所以使用const修饰,限制指针p

输出:

输出*p的值,p的值为常量字符串首元素的地址,即字符a的地址,所以输出的是a

输出p,当以%s格式输出时,会输出整个字符串。

结果分析:

常量字符串存储在只读数据区,相同的字符存储在同一块内存,所以第一个输出的是 ==

利用常量字符串初始化字符数组str1和str2,字符数组str1和str2会独立开辟空间存储

当把st1和str2的首元素地址分别赋值给ps1和ps2时,由于地址不相同,所以输出的是 !=


二、数组指针

2.1 数组指针基础

数组指针是指向数组的指针。

数组指针的语法定义如下:

c 复制代码
	数组元素类型 (*指针变量名)[数组大小];
	//例如
	int (*pa)[10];

pa是一个数组指针
指向的数组长度大小为10
指向的数组元素类型为int
pa的类型为:int (*)10

再论数组名
一般情况下,数组名表示数组首元素地址;

特殊情况:

  1. sizeof(数组名),单独的数组名在sizeof(),求出的整个数组的大小,则数组名表示整个数组;
  2. &数组名,单独的数组名取地址,得到的是整个数组的地址,则数组名表示整个数组。

结果分析:

虽然arr和&arr的值相同,但是代表的意义完全不同。

arr表示首元素地址,arr+1表示的是第二2个元素,int 数组,所以他们相差4个字节的大小。

&arr表示整个数组的地址,&arr+1表示跳过一个数组,int10数组,所以他们相差40个字节。

2.2 数组指针作函数参数

数组指针作参数,一般是作二维及以上数组的参数。

c 复制代码
//数组指针作参数
void print1(int(*pa)[3], int row, int col)
{
	int i = 0;
	for (i = 0; i < row; i++)
	{
		int j = 0;
		for (j = 0; j < col; j++)
		{
			printf("%d ",*(*(pa+i)+j));
		}
		printf("\n");
	}
}

结果分析:

利用数组指针作为参数,遍历二维数组

arr表示数组名,表示数组首元素地址,二维数组首元素地址是第一行,即一个一维数组的地址

*(pa+i) 表示二维数组的第i行的首元素地址

*(pa+i)+ j 表示的是二维数组第i行第j列元素的地址

* (*(pa+i) + j)访问二维数组第i行第j列的元素,相对于arrij


总结

相关推荐
C语言小火车1 小时前
C++ 快速排序(Quick Sort)深度精讲:分治思想、Lomuto 分区法及三数取中优化,面试手撕必会
c语言·开发语言·c++·面试·排序算法·快速排序
aaaameliaaa3 小时前
进制练习题【找出只出现一次的数字、交换两个变量(不创建临时变量)、统计二进制中1的个数、打印整数二进制的奇数位和偶数位、求两个数二进制中不同位的个数】
c语言·数据结构·笔记·算法
灯厂码农3 小时前
C语言内存管理——内存对齐与共用体union
linux·服务器·c语言
伏 念6 小时前
AI Coding 零基础实战教程
c语言·进程·预处理
你家人养牛6 小时前
OOC Relation Plugin:C 语言面向对象 开发的高效辅助工具
c语言·vscode
想你依然心痛6 小时前
嵌入式C代码规范:MISRA-C 2012核心规则解读——类型安全与未定义行为深度剖析
c语言·安全·代码规范
未来之窗软件服务7 小时前
计算机考试-C语言 应用题—东方仙盟
c语言·开发语言·仙盟创梦ide·东方仙盟·计算机考试
luj_17687 小时前
草酸与烟酸对消化及糖代谢的影响解析
服务器·c语言·开发语言·经验分享·算法
fei_sun7 小时前
【SystemVerilog】SystemVerilog与C语言的接口
c语言·开发语言
十月的皮皮9 小时前
C语言学习学习笔记20260704-中缀表达式求值(双栈法)
c语言·笔记·学习