C语言--指针详解(下)--字符指针、数组指针、指针数组、函数指针、函数指针数组(转移表)

这篇具有很好参考价值的文章主要介绍了C语言--指针详解(下)--字符指针、数组指针、指针数组、函数指针、函数指针数组(转移表)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1. 字符指针

在C语言中有一种指针类型为字符指针 char*,常用其来表示字符,使用如下:

#include <stdio.h>
int main()
{
	char ch = 'w';
 	char *pc = &ch;
 	*pc = 'w';
 	return 0;
}

除了上述用法之外,还可以有以下的用法:

int main()
{
 const char* pstr = "hello word";
 printf("%s\n", pstr);
 return 0;
 }

在上面的代码中,字符 " hello word "是常量字符串,将"hello word"放入 pstr 指针的实质是将第一个字符 “ h " 的地址传递给了 pstr ,通过首字符 ” h " 就可以访问整个字符串。

注意:常量字符串传递给不同的字符指针变量的时候,传过去的地址是相同的,因为常量字符串是存放在静态区的,它的地址是唯一的。

如下面这道例题:

#include <stdio.h>

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

结果如下:
C语言--指针详解(下)--字符指针、数组指针、指针数组、函数指针、函数指针数组(转移表),c语言,开发语言,学习

2. 数组指针

数组指针其本质是指针,数组是用来修饰指针的,表明这个指针是用来存放数组的,即其存放的数据类型是数组。

那如何表示呢?

首先,是一个指针,那么一定有 *arr
其次数据类型是数组(以10个整形类型为例),则一定有int [ 10 ]
合起来便是 int (*arr)[ 10 ],即 arr 是⼀个指针,指向⼀个数组,叫数组指针。
因为 [] 与arr结合的优先级要优先于 * ,因而要加括号;否则就变为了指针数组(详细见下指针数组)

数组指针类型解析:

int (*p) [10] = &arr;
 |    |   |
 |    |   |
 |    |   p指向数组的元素个数
 |    p是数组指针变量名
 p指向的数组的元素类型

数组指针变量是⽤来存放数组地址的,那怎么获得数组的地址呢?就是我们之前学习的 &数组名

	int a[10] = {0};
	&a;//得到的就是数组的地址 

如果要存放个数组的地址,就得存放在数组指针变量中,如下:

int(*arr)[10] = &a;

使用如下:

//以打印第一个数据为例
printf("%d", *(arr+0));
//等价于:printf("%d", a[0]);

在此处便可以很好看出数组名其实就是数组的首地址,有以下等价式:

*(p + i) = p[i] = arr[i] =*(arr + i) = i[arr]

详情见**“数组名的理解”**:C语言–指针详解(中)–指针的基本使用、指针在数组中的应用

3. 指针数组

指针数组其本质是数组,指针是用来修饰数组的,表明这个数组是用来存放指针的,即其存放的数据类型是指针。

那如何表示呢?(与上述数组指针对比)

首先,是一个数组(以10个整形类型为例),那么一定有 arr[10]
其次数据类型是指针,则一定有int *
合起来便是 int * arr[ 10 ],即 arr 是⼀个数组,指向一个由指针组成的数组,叫指针数组。
因为 [] 与arr结合的优先级要优先于 * ,因而不用加括号。

指针数组类型解析:

int*  p [10] = &arr;
 |    |   |
 |    |   |
 |    |   p指向数组的元素个数
 |    p是指针数组变量名
 p指向的数组的元素类型
char p1 = 'a';
char p2 = 'b';
char p3 = 'c';
char p4 = 'd';
int* arr[10] ={ &p1, &p2, &p3, &p4 };

指针数组一般用于存放多个指针类型的数据,且一般不单独使用,主要用于组成转移表,详细见下转移表。

4. 函数指针

函数指针变量是⽤来存放函数地址的,通过地址就能够调⽤函数。

其基本形式为:int (*arr) (int,int)

函数指针类型解析:

int (*pf3) (int x, int y)
 |     |    ------------ 
 |     |        |
 |     |        pf3指向函数的参数类型和个数的交代
 |    函数指针变量名
 pf3指向函数的返回类型
 
 int (*) (int x, int y) //pf3函数指针变量的类型 

有以下三种形式:

void test()
{
 printf("hehe\n");
}
void (*pf1)() = &test;
void (*pf2)()= test;//函数名在本质上也是地址,&函数名==函数名
int Add(int x, int y)
{
 return x+y;
}

int(*pf3)(int, int) = Add;

int(*pf3)(int x, int y) = &Add;//x和y写上或者省略都是可以的 

通过函数指针调⽤指针指向的函数。

#include <stdio.h>

int Add(int x, int y)
{
 return x+y;
}

int main()
{
 int(*pf3)(int, int) = Add;
 
 printf("%d\n", (*pf3)(2, 3));
 printf("%d\n", pf3(3, 5));
 return 0;
}

输出结果:

5
8

5. 函数指针数组(转移表)

把函数的地址存到⼀个数组中,那这个数组就叫函数指针数组。

基本形式:int (*parr1[3])();

parr1 先和 [ ] 结合,说明parr1是数组,数据类型是 int ( * )( ) 类型的函数指针

函数指针数组的⽤途:转移表

举例:计算器的⼀般实现:

#include <stdio.h>

int add(int a, int b)
{
 	return a + b;
}

int sub(int a, int b)
{
 	return a - b;
}

int mul(int a, int b)
{
 	return a * b;
}

int div(int a, int b)
{
 	return a / b;
}

int main()
{
	 int x, y;
	 int input = 1;
	 int ret = 0;
	 do
	 {
		 printf("*************************\n");
		 printf(" 1:add 2:sub \n");
		 printf(" 3:mul 4:div \n");
		 printf(" 0:exit \n");
		 printf("*************************\n");
		 printf("请选择:");
		 scanf("%d", &input);
		 switch (input)
		 {
			 case 1:
				 printf("输⼊操作数:");
				 scanf("%d %d", &x, &y);
				 ret = add(x, y);
				 printf("ret = %d\n", ret);
				 break;
			 case 2:
				 printf("输⼊操作数:");
				 scanf("%d %d", &x, &y);
				 ret = sub(x, y);
				 printf("ret = %d\n", ret);
				 break;
			 case 3:
				 printf("输⼊操作数:");
				 scanf("%d %d", &x, &y);
				 ret = mul(x, y);
				 printf("ret = %d\n", ret);
				 break;
			 case 4:
				 printf("输⼊操作数:");
				 scanf("%d %d", &x, &y);
				 ret = div(x, y);
				 printf("ret = %d\n", ret);
				 break;
			 case 0:
				 printf("退出程序\n");
				 break;
				 default:
				 printf("选择错误\n");
				 break;
		 }
	 } while (input);
	 return 0;
 }

使⽤函数指针数组的实现:

#include <stdio.h>
int add(int a, int b)
{
	 return a + b;
}

int sub(int a, int b)
{
	 return a - b;
}

int mul(int a, int b)
{
	 return a*b;
}

int div(int a, int b)
{
	 return a / b;
}

int main()
{
	 int x, y;
	 int input = 1;
	 int ret = 0;
	 int(*p[5])(int x, int y) = { 0, add, sub, mul, div }; //转移表 
	 do
	 {
		 printf("*************************\n");
		 printf(" 1:add 2:sub \n");
		 printf(" 3:mul 4:div \n");
		 printf(" 0:exit \n");
		 printf("*************************\n");
		 printf( "请选择:" );
		 scanf("%d", &input);
		 if ((input <= 4 && input >= 1))
		 {
			 printf( "输⼊操作数:" );
			 scanf( "%d %d", &x, &y);
			 ret = (*p[input])(x, y);
			 printf( "ret = %d\n", ret);
		 }
		 else if(input == 0)
		 {
			 printf("退出计算器\n");
		 }
		 else
		 {
			 printf( "输⼊有误\n" ); 
		 }
	 }while (input);
	 return 0;
}

6. 总结

字符指针、数组指针、指针数组、函数指针、函数指针数组涵盖了在指针学习中有关指针的绝大多数的情况,熟练掌握它们,将对学习指针有巨大的帮助。同时,指针部分是C语言学习中重要的部分之一,熟练掌握指针对于C语言学习来说很重要。文章来源地址https://www.toymoban.com/news/detail-779490.html

到了这里,关于C语言--指针详解(下)--字符指针、数组指针、指针数组、函数指针、函数指针数组(转移表)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【C语言】指针的基本知识详细讲解(指针数组、数组指针、函数指针....

    接着上次的函数的基本知识,今天我们来讲一讲🔍指针 目录 一、指针的概念 二、指针变量 三、野指针 四、字符指针 五、指针与数组 六、指针数组 七、数组指针  八、指针与函数 总结 一、指针的概念 1.1、变量和地址 所谓指针,也就是内存的地址;所谓指针变量,也就是

    2023年04月08日
    浏览(31)
  • 【C语言】——指针四:字符指针与函数指针变量

      在前面的学习中,我们知道有一种指针类型为 字符指针: c h a r ∗ char* c ha r ∗ 。下面我们来介绍它的使用方法。    使用方法:      如果我们想 存储字符串 ,可以用什么方法呢?之前我们一般都是用 字符数组 ,那还有什么办法呢?其实, 字符指针 也是可以

    2024年04月12日
    浏览(29)
  • (C语言)用函数指针数组实现计算器

    一、运算结果; 二、源代码;

    2024年01月19日
    浏览(30)
  • 厦大2021届大一小学期C语言作业1 数组+字符串+指针+位操作

    题目描述: 1.程序要求:实现对5个数(a[0]~a[4],数组元素从键盘读入)进行从大到小起泡法排序。输入第一组数据:1 2 3 4 5;输入第二组数据:3 5 4 1 2;验证程序的正确性。 题目描述: 2.程序要求:实现三阶方阵转置,并打印转置后的方阵。 测试主函数为: int main() { in

    2024年02月15日
    浏览(32)
  • 复习第七课 C语言-指针数组,函数,string

    目录 【1】指针和数组 【2】数组指针 【3】指针数组 【4】函数 【5】函数传参 【6】动态开辟堆区空间 【7】string函数族 【8】递归函数 练习: 直接访问:通过数组名访问 间接访问:通过指针访问 》1. 一维数组 运算方法: 1) *和++都是弹幕运算符,优先级相同 2) 单目运算

    2024年02月16日
    浏览(26)
  • 计算字符串长度的三种方法(库函数 指针 )【详解】

    求字符串长度简单来说就是计算一个字符串(字符数组)中元素的个数即从数组头部计数,直到遇到字符串’\\0’结束符为止, 计数结果不包括’\\0’. C语言中的库函数strlen,它包含于string.h中,因此我们需要在使用前添加头文件 ,具体用法如下: strlen从数组头部计数,直到遇到字

    2024年02月06日
    浏览(58)
  • C语言:写一个函数,求字符串的长度,在main函数中输入字符串并输出其长度(指针)

    分析:    在程序中,定义一个函数 fix,该函数使用指针变量来访问字符串中的每个字符,并计算出字符串的长度。fix 函数的参数为指向 char 类型的指针变量 p,表示需要计算长度的字符串。   在主函数 main 中,定义一个大小为 20 的字符数组 a,用于存储输入的字符串。然

    2024年01月21日
    浏览(47)
  • C 多维数组、特殊字符和字符串函数详解

    数组,也称为单维数组。这些非常棒,是您在 C 语言编程中会经常使用的东西。然而,如果您想要将数据存储为表格形式,例如带有行和列的表格,则需要熟悉多维数组。 二维数组也称为矩阵,具有行和列的结构。 第一个维度表示行数 [2],而第二个维度表示列数 [3]。 要访

    2024年02月03日
    浏览(34)
  • C语言 函数指针详解

    1.1、概念 函数指针 :首先 它是一个指针,一个指向函数的指针,在内存空间中存放的是函数的地址 ; 示例: 函数名是等于函数地址 的! 1.2、函数指针的使用方法 函数指针的定义 : 函数的返回值类型(*指针名)(函数的参数列表类型 ) 1.3、怎么使用函数指针去调用函

    2024年02月14日
    浏览(32)
  • 【C语言进阶】⑥函数指针详解

    1.概念 函数指针 :首先它是一个指针,一个指向函数的指针,在内存空间中存放的是函数的地址; 请看示例: 解析:parr是一个指向数组的指针,存放的是数组的地址; 所以: 数组指针 —存放数组地址的指针; 数组名 —得到的就是数组的地址; 那么我们可以不可以这么认

    2024年02月02日
    浏览(31)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包