指针数组和数组指针和函数指针

文章目录

  • 1.指针数组和数组指针
    • 1.int *p1[10];
    • 2.int (*p2)[10];
  • 2.函数指针
    • char *(*fun1)(char * p1,char *p2)
    • 函数指针的概念
    • 函数指针的作用:
      • 例子1 .调用方式
      • 例子2:(带注释)
      • 例子3
  • 3.做题的小技巧

1.指针数组和数组指针

1.int *p1[10];

int *p1[10];

指针数组:存储指针的数组(数组的元素都是指针,数组所占字节
     由数组本身决定)

2.int (*p2)[10];

int (*p2)[10];

详解

int (*) [10]`(指针类型)
p2`    (指针变量)

数组指针:指向数组的指针(32位系统下永远是4个字节,他指向
     的数组占字节数未知)
注:()>[]>*
运算优先级速查链接
https://blog.csdn.net/csdn_kou/article/details/80139099

2.函数指针

char *(*fun1)(char * p1,char *p2)

函数指针的概念

char *(*fun1)(char * p1,char *p2)

详解

char *(*)(char * p1,char *p2)(指针类型)
fun1(指针变量)

函数指针的作用:

例子1 .调用方式

char * fun(char *p1, char *p2)
{}
int main()
{char *(*p)(char * p1, char *p2);p = &fun;(*p)("aa", "nn");system("pause");return 0;
}

上面的例子我们还无法看出他的优势。
函数指针数组

例子2:(带注释)

#define _CRT_SECURE_NO_WARNINGS 
#include <stdio.h>
#include <stdlib.h>/*四种算法*/
int Add(int x, int y)
{return x + y;
}
int Sub(int x, int y)
{return x - y;
}
int Mul(int x, int y)
{return x * y;
}
int Div(int x, int y)
{return x / y;
}void calc(int(*p)(int, int))
{//calc(int Add(int ,int )int ret = 0;int x = 0;int y = 0;printf("请输入两个操作数:>");scanf("%d%d", &x, &y);ret = p(x, y);// Add(x,y);printf("ret = %d\n", ret);
}int main()
{int (*p[5])(int, int) = {0, Add, Sub, Mul, Div};//指针变量p[5],内部5个元素,加减乘除int input = 0;do{scanf("%d", &input);if(input>=1 && input<=4)calc(p[input]);//calc(Add);//Add 指针类型是 int (*)(int ,int )elseprintf("退出\n");} while (input);
}

例子3

#include <stdio.h>#define  GET_MAX 	0
#define  GET_MIN 	1int get_max(int i, int j)
{return i > j ? i : j;
}int get_min(int i, int j)
{return i > j ? j : i;
}int compare(int i, int j, int flag)//1
{int ret;//这里定义了一个函数指针,就可以根据传入的flag,灵活地决定其是指向求大数或求小数的函数//便于方便灵活地调用各类函数int(*p)(int, int);//2if (flag == GET_MAX)//3p = get_max;elsep = get_min;ret = p(i, j);//4return ret;
}int main()
{int i = 5, j = 10, ret;ret = compare(i, j, GET_MAX);printf("The MAX is %d\n", ret);ret = compare(i, j, GET_MIN);printf("The MIN is %d\n", ret);return 0;
}

3.做题的小技巧

  • 画图
  • 数组在内存中是连续存放,不是矩阵形式
  • 在32位系统下,不管什么类型的指针,永远只占四个字节
  • 二维数组的内存分布a[i][j] = * (*(a+i)+j)
  • 函数本身没有类型,函数的返回值才有类型。
    后续再补充

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/382872.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用虚拟环境virtualenv 创建虚拟环境出现PermissionError: [Errno 13] Permission denied:

使用虚拟环境virtualenv 创建虚拟环境出现PermissionError: [Errno 13] Permission denied: 原因&#xff1a;虚拟环境安装的目录所属用户非当前用户 解决办法&#xff1a;将目录及其文件的所有者改为当前用户 解决命令&#xff1a;sudo chown -R 当前用户 待更改用户的目录/ …

linux之父子进程的输出

首先&#xff0c;我们来回忆一下父进程与子进程&#xff0c;前几节讲了如何创建子进程&#xff0c;像这样的&#xff0c;pid_t id fork(); 这样我们就创建好了一个子进程&#xff0c;然而fork()函数的返回值是什么呢&#xff1f;这里要记住&#xff1a;子进程返回0&#xff0c…

linux---谈谈vfork和fork的区别及exit与return

fork()&#xff1a;创建子进程的函数&#xff0c;是大家比较熟悉的吧。pid_t id fork(); 这里的vfork();也是创建子进程的函数。现在我们来剖析一下它们吧。 第一例&#xff1a; 先看一个fork()的例子哦。 对于fork()而言&#xff0c;创建子进程成功后直接打印出父子进程执…

在MySQL数据库建立多对多的数据表关系

转载自 https://blog.51cto.com/13145200724/1370753

C语言模拟实现标准库函数之qsort()

qsort 编译器函数库自带的快速排序函数。 void qsort(void*base,size_t num,size_t width,int(__cdecl*compare)(const void*,const void*)); 参数解释&#xff1a; void*base-待排序数组首地址size_t num-数组中待排序元素数量size_t width-各元素的占用空间大小int(__cde…

django contrib 包简介

转自 https://www.cnblogs.com/tianboblog/p/6955297.html

linux之管道

管道&#xff08;PIPE&#xff09;是linux中一个重要的通信方式&#xff0c;在进程中&#xff0c;我们通过从一个进程中读取到的数据转到另一个进程中的写数据中&#xff0c;这时就要有不同的进程之间共享同一份资源&#xff0c;就是所谓的进程间通信。由于进程的特点是资源独占…

把student a am i 变成 i am a student(两种方法)

文章目录#student a am i 变成 i am a student##方法1&#xff1a;指针#include <stdlib.h> #include <stdio.h> #include <string.h>void fanw(char *l, char *r) {char* left l;char* right r;char temp;while (left < right){temp *left;*left *ri…

关掉占用 某端口的进程

sudo fuser -k 8000/tcp 这样和端口8000相关的进程就都关了。

linux之多线程(1)

我们之前讲了进程&#xff0c;今天我们重新认识另外一个概念---线程。我们首先会想到的是进程和线程有什么区别和联系&#xff0c;对吧&#xff1f;进程是由程序执行起来&#xff0c;跑在操作系统的&#xff0c;是系统进行资源分配和调度的基本单位。进程具有资源独占性&#x…

C语言typedef与#define的区别

typedef和#define define 没有参加编译&#xff0c;在预处理的时候就被替换掉了。 typedef参加编译和链接。typedef是重命名&#xff0c;可以为枚举结构体等等重新命名&#xff0c;提高代码整洁。 一、typedef的用法 C语言中&#xff0c;typedef常用来定义一个标识符及关键…

django models模型 内部类 class Meta 简介

class Meta: #这个属性是定义当前的模型类是不是一个抽象类。所谓抽象类是不会相应数据库表的。一般我们用它来归纳一些公共属性字段&#xff0c;然后继承它的子类能够继承这些字段。abstractTrue #db_table是用于指定自己定义数据库表名的db_table test#因为Django的管理方法…

阻断血缘关系以及checkpoint文件清理

spark-sql读写同一张表&#xff0c;报错Cannot overwrite a path that is also being read from 1. 增加checkpoint&#xff0c;设置检查点阻断血缘关系 sparkSession.sparkContext.setCheckpointDir("/tmp/spark/job/OrderOnlineSparkJob")val oldOneIdTagSql s&…

linux之睡眠函数(my_sleep)

我们在程序中&#xff0c;很多次用到sleep()函数&#xff0c;让它睡眠几秒后再执行该进程。今天呢&#xff0c;我要给大家实现一下sleep函数。 看看代码哦&#xff1a; 运行结果&#xff1a; 结果中每隔三秒钟&#xff0c;打印一条语句。实现了sleep(3)的功能。 关于sleep函数…

C语言 防止头文件被多次引用

comm.h和comm.c是公共模块。 test1.h和test1.c使用了公共模块。 test2.h和test2.c使用了了公共模块。 test.h和test.c使⽤用了了test1模块和test2模块。 这样最终程序中就会出现两份comm.h的内容。这样就造成了了文件内容的重复。 1.方法1 文件开头加上这一句就ok #prag…

python字符串切片操作

name abcdefghijk name[2:-1] cdefghijname[2:] cdefghijk # 第三个参数是步长 name[2:-1:2] cegi# 字符串反转 name[::-1] name[-1::-1] kjihgfedcba kjihgfedcba

机器思维。一些让我眼前一亮的算法。

用人脑相处了计算机处理数据的方式。而不是 人脑处理的方式—>用计算机的语言表达 人脑处理的方式—>计算机处理的方式—>用计算机的语言表达

python 之 __new__ 方法理解

python的new方法 使用场景不同效果也不一样 一种是指定元类时候&#xff0c; metaclassMyType 类型 这种方式 在解释器执行到 metaclassCrawlerProxyMetaclass 的时候&#xff0c; __new__方法就开始执行&#xff01; 这里的 __new__方法是用来创建类对象的 class CrawlerProx…

详解强制类型转换

今天谈谈类型转换的问题吧&#xff0c;之前我们也遇到过类型转换&#xff0c;比如c语言中这样的赋值&#xff1a; 显然&#xff0c;i和j是不同类型的变量&#xff0c;但是却可以完成赋值&#xff0c;结果是这样的&#xff1a; 其实它们是做了隐式的类型转换&#xff0c;相当于&…

面试--输入一堆随机数(0-1000),这里面会有重复的数字,把他们去除掉。然后由大到小排列。

1.问题说明 11 10 20 40 32 67 40 20 89 300 400 15 10 15 20//只显示1次 32 40//只显示1次 67 89 300 400 正常的算法&#xff1a; 1.遍历所有数组&#xff0c;去除掉重复的数字 2.使用XX排序法&#xff0c;进行数字的排序。 眼前一亮的机器算法 1.生成1-1000的数组&am…