【C语言进阶】指针与数组、转移表详解

本文详细介绍了C语言中的指针进阶知识,包括字符指针、指针数组、数组指针、函数指针等概念,以及如何使用它们。通过示例代码解释了数组名和地址的区别,并探讨了一维和二维数组作为参数传递给函数的不同方式。此外,文章还讨论了函数指针和函数指针数组的应用,以及如何利用它们实现一个简单的计算器。
摘要由CSDN通过智能技术生成

前言

大家好我是程序猿爱打拳,我们在学习完指针的基本概念后知道了指针就是地址,我们可以通过这个地址并对它进行解引用从而改变一些数据。但只学习指针的基础是完全不够的,因此学习完指针的基础后我们可以学习关于指针的进阶,其中包括指针数组、数组指针、函数指针等。这篇文章的末尾也有模拟实现计算器源码及讲解。

目录

1.字符指针

2.指针数组

3.数组指针

3.1&数组名和数组名

3.2数组指针的定义

3.3数组指针的使用

4.数组参数、指针参数

4.1一维数组传参

4.2二维数组传参

4.3一级指针传参

4.4二级指针传参

5.函数指针

6.函数指针数组

6.1函数指针数组定义

7.实现计算器

7.1使用switch实现

7.2使用转移表实现


1.字符指针

经过学习指针的基础后,我们知道了有一种指针类型为字符指针char*。一般这样写代码:

#include<stdio.h>

int main()
{
	char ch = 'a';
	char *p = &ch;
	*p = 'b';
	printf("%c\n", ch);
	return 0;
}

以上代码最终输出的值为b,对指针p进解引用并赋新值从而改变了ch的值我们不难理解。还有一种写代码方式:

#include<stdio.h>

int main()
{
	const char* p = "Hello World";
	printf("%s\n", p);
	return 0;
}

输出结果

以上代码,我们把Hello World的首字符地址赋值给了指针p并不是把整个Hello World赋值给了指针p,因此在输出的时候是从H开始依次往后面输出的。当然我们在指针初阶学过以""初始化一个字符串的时候,字符串末尾会默认生成'\0'(结束标识符)。


 在理解以上程序后,我们来看一组代码:

#include<stdio.h>

int main()
{
	char str1[] = "Hello World.";
	char str2[] = "Hello World.";
	const char* str3 = "Hello World.";
	const char* str4 = "Hello World.";
	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;
}

输出结果:

以上代码,可能有些朋友认为str1不是和str2一模一样吗,为啥输出else后面的结果呢。其实是这样的。

str1和str2没有被const修饰的话是分别在内存中占不同的空间,str3和str4两个字符串都被const修饰了因此占用的空间是一致的。所以str1不等于str2,str3等于str4。


2.指针数组

在指针基础知识中我们学到了指针数组是存放指针的数组。如以下代码:

	int* arr1[3];//整型指针的数组
	char *arr2[4];//一级字符指针的数组
	int **arr3[5];//二级字符指针的数组

我们拿整型指针的数组来举例:

#include<stdio.h>

int main()
{
	int arr1[2] = { 1,2 };
	int arr2[2] = { 3,4 };
	int arr3[2] = { 5,6 };
	int* arr4[3] = { arr1,arr2,arr3 };
	for (int i = 0; i < 3; i++)
	{
		for (int j = 0; j < 2; j++)
		{
			printf("%d", arr4[i][j]);
		}
	}
	return 0;
}

输出结果:

以上代码中int *arry4[3]就是一个存放整型指针的数组,它的每一个元素都存放的是一个地址,这些地址分别是arr1,arr2,arr3的数组名也就是第一个元素的地址。通过这些个地址就能依次访问到这个地址及这个地址以后的内容,如通过arr1的地址访问到了1和2。


3.数组指针

数组指针是什么呢,指针还是数组?其实它是指针。我们在指针初阶知道了整型指针可以这样定义:int * p;说了了p指向的是一个整型。浮点型指针可以这样定义:float * p;说明了p指向的是一个单精度浮点型。


3.1&数组名和数组名

我们在数组学习的时候已经知道了

评论 22
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一只爱打拳的程序猿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值