【C语言进阶】指针进阶 —— 指针回顾与字符指针

【C语言进阶】指针进阶 —— 指针回顾与字符指针

正文


本章目标

复习指针的基本内容,学习并掌握数组指针指针数组函数指针函数指针数组、以及回调函数等概念。

本章重点:

1.字符指针

2.数组指针

3.指针数组

4.数组传参和指针传参

5.函数指针

6.函数指针数组

7.指向函数指针数组的指针

8.回调函数

9.指针和数组面试题的解析

10.指针笔试题详解


指针回顾

指针的主题,在C语言初阶《指针》部分就已经接触过。

  • 指针变量用来存放对象的地址地址唯一标识一块内存单元(内存会划分为一个个小的内存单元,每个内存单元都有唯一的地址编号)。
  • 指针变量的大小是固定的4/8个字节(32位平台/64位平台)。
  • 指针变量是有类型的指针变量的类型决定了指针±整数的步长指针变量进行解引用时的权限(能够访问多少个字节)。
  • 指针的运算(指针±整数、指针-指针、指针的关系运算)。


一、字符指针

指针变量指向对象的类型为字符型 char ,指针变量的类型为 char*

1 示例1

代码示例

#include<stdio.h>

int main()
{
	//字符指针

	char ch = 'w';
	char* pc = &ch;//pc是字符指针
	*pc = 'a';

	return 0;
}

解释说明

1 指针变量 pc 指向字符型变量 ch

2 ch*pc 管理的是同一段内存空间


2 示例2

代码示例

#include<stdio.h>

int main()
{
	//字符指针的其他使用方法

	const char* pstr = "hello wdt.";//指针变量存放的是字符串的首字符地址
	printf("%s\n", pstr);	//hello wdt.
	printf("%c\n", *pstr);	//h

	return 0;
}

解释说明

1 const char* pstr = "hello wdt.";

  常量字符串 "hello wdt." 存放在代码段;而指针变量 pstr 存放的是该字符串首字符 h 的地址

2 字符指针存储的是常量字符串首字符的地址

字符指针

3 示例代码的意思是把一个常量字符串的首字符 h 的地址存放在指针变量 pstr

字符指针与常量字符串


3 示例3

代码示例

#include<stdio.h>

int main()
{
	//字符数组与字符指针

	//创建字符数组存放字符,开辟不同的内存块,数组空间独立
	char str1[] = "hello wdt.";
	char str2[] = "hello wdt.";

	//字符指针存放常量字符串的首字符地址
	const char* str3 = "hello wdt.";
	const char* str4 = "hello wdt.";

	if (str1 == str2)
	{
		printf("str1 and str2 are same\n");
	}
	else
	{
		printf("str1 and str2 are not same\n");//输出结果,两个数组的首地址不相同
	}

	if (str3 == str4)
	{
		printf("str3 and str4 are same\n");//输出结果,两个指针变量存放的地址相同
	}
	else
	{
		printf("str3 and str4 are not same\n");
	}

	return 0;
}

解释说明

1 用字符串来初始化字符数组不同的数组开辟不同的内存空间,占用不同的内存块,拥有不同的地址

字符数组存储字符串

2 常量字符串存储在常量区,只创建一次不同的字符指针存放同一常量字符串首元素的地址

字符指针指向常量字符串

注意:

1 C/C++ 会把常量字符串存储到单独的一个内存区域,当多个指针变量指向同一个字符串的时候,它们实际指向的是同一块内存

2 用相同的常量字符串去初始化不同的数组的时,会开辟出不同的内存块,只是存储的元素相同罢了


总结:

  本节给出了指针进阶的目标与重点;对指针进行了简单的回顾;讲解了字符数组与字符指针的使用。


感谢您的阅读!如有任何错误,欢迎您的批评指正!

  • 22
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值