c中指针简介

c中指针简介

首先我们来看一下指针的一些基本概念
![在这里插入图片描述](https://img在这里插入图片描述
而对于指针的应用,平常有一些形式,总结了一下大概有这几种用法
在这里插入图片描述
对于以上的几种用法,我依次给出详尽的解释
//这是一个普通的整型变量

1 //首先从P 处开始,先与*结合,所以说明P 是一个指针,然后再与int 结合,说明指针所指向的内容的类型为int 型.所以P是一个返回整型数据的指针

2 //首先从P 处开始,先与[]结合,说明P 是一个数组,然后与int 结合,说明数组里的元素是整型的,所以P 是一个由整型数据组成的数组

3 //首先从P 处开始,先与[]结合,因为其优先级比高,所以P 是一个数组,然后再与结合,说明数组里的元素是指针类型,然后再与int 结合,说明指针所指向的内容的类型是整型的,所以P 是一个由返回整型数据的指针所组成的数组

4 //首先从P 处开始,先与*结合,说明P 是一个指针然后再与[]结合(与"()"这步可以忽略,只是为了改变优先级),说明指针所指向的内容是一个数组,然后再与int 结合,说明数组里的元素是整型的.所以P 是一个指向由整型数据组成的数组的指针**

5 //首先从P 开始,先与结合,说是P 是一个指针,然后再与结合,说明指针所指向的元素是指针,然后再与int 结合,说明该指针所指向的元素是整型数据.由于二级指针以及更高级的指针极少用在复杂的类型中,所以后面更复杂的类型我们就不考虑多级指针了,最多只考虑一级指针.

6 从P 处起,先与()结合,说明P 是一个函数,然后进入()里分析,说明该函数有一个整型变量的参数,然后再与外面的 int 结合,说明函数的返回值是一个整型数据

7 //从P 处开始,先与指针结合,说明P 是一个指针,然后与()结合,说明指针指向的是一个函数,然后再与()里的int 结合,说明函数有一个int 型的参数,再与最外层的int 结合,说明函数的返回类型是整型,所以P 是一个指向有一个整型参数且返回类型为整型的函数的指针**

8 //可以先跳过,不看这个类型,过于复杂从P 开始,先与()结合,说明P 是一个函数,然后进入()里面,与int 结合,说明函数有一个整型变量参数,然后再与外面的结合,说明函数返回的是一个指针,然后到最外面一层,先与[]结合,说明返回的指针指向的是一个数组,然后再与*结合,说明数组里的元素是指针,然后再与int 结合,说明指针指向的内容是整型数据.所以P 是一个参数为一个整数据且返回一个指向由整型指针变量组成的数组的指针变量的函数.**

接下来我们具体来看一些指针类型

字符指针

在这里插入图片描述
还有一种方式是把字符串的首地址放到字符指针中
在这里插入图片描述
那么会有这样的一个问题
在这里插入图片描述
上述程序的结果如下图,为什么不一样呢?
在这里插入图片描述
这里str3和str4指向的是一个同一个常量字符串。C/C++会把常量字符串存储到单独的一个内存区域,当几个指
针。指向同一个字符串的时候,他们实际会指向同一块内存。但是用相同的常量字符串去初始化不同的数组的时候
就会开辟出不同的内存块。所以str1和str2不同,str3和str4不同。

指针数组

在这里插入图片描述

数组指针

在这里插入图片描述
我们来看一段代码
在这里插入图片描述
他的运行结果为
在这里插入图片描述
所以我们会得出一个结论,那就是数组名和&数组名打印的地址是一样的
但是真的是一样的吗?
我们再来看一段代码
在这里插入图片描述
再来看看他们的打印的结果
在这里插入图片描述
那么为什么会这样呢?
其实,其实&arr和arr,虽然值是一样的,但是意义应该不一样的。
实际上: &arr 表示的是数组的地址,而不是数组首元素的地址。所以&arr+1其实是取了整个数组的地址并跳过了整个数组
数组的地址+1,跳过整个数组的大小,所以 &arr+1 相对于 &arr 的差值是40.

数组指针具体如何使用,用一个代码来具体体现
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
指针除了上述的一些引用外,最主要的是用于函数的参数
数组参数,指针参数
一维数组传参
在这里插入图片描述
在这里插入图片描述
以上的形式都是合理定义参数的方法
二维数组传参
在这里插入图片描述
一级指针传参
在这里插入图片描述
二级指针传参
在这里插入图片描述
我们来看一下一段代码

在这里插入图片描述
我们可以看,第一次调用时传的时pc指针的地址,而本身pc这个变量是(char *)类型,所以传pc的地址,就需要用char **来接受,而第三次传参时,因为arr是一个指针数组,它每一个元素存的是一个指针,但传它的数组名,也就是传首元素的地址,其实也就是一个一级指针,所以传它的地址也就是传二级指针,所以没有问题。

函数指针

在这里插入图片描述
运行结果为
在这里插入图片描述
输出的是两个地址,这两个地址是 test 函数的地址。 那我们的函数的地址要想保存起来,怎么保存?
我们就可以用函数指针
在这里插入图片描述
首相要存地址,必须是指针,所以pfun1可以,因为pfun1先和*结合再指向一个函数,函数无返回值。

函数指针数组

那要把函数的地址存到一个数组中,那这个数组就叫函数指针数组,那函数指针的数组如何定义呢?
在这里插入图片描述
首先parr1先和【】结合,说明parr1是数组,数组的内容是什么呢? 是 int (*)() 类型的函数指针
函数指针数组的用途:转移表

指向函数指针数组的指针

指向函数指针数组的指针是一个 指针 指针指向一个 数组 ,数组的元素都是 函数指针 ;
在这里插入图片描述

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

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

相关文章

判断一个字符串是否另一个字符串的右移后的

首先我们把需要判断的字符串传进来,开辟一块大小为两个字符串的长度总和加1的动态的空间,然后后字符串拷贝函数将一个字符串拷贝到开辟空降中,再将这个字符串再次连接到这块动态的空间中,等于就是将一个字符串拷贝了两遍。然后比较…

登陆后保持环境变量导出

在嵌入式开发中,要保证在系统登录后,导出的环境变量依然有效,需要修改如下文件: /etc/profile export PATH/bin:/sbin:/usr/bin:/usr/sbin export PATH/system/bin:$PATH export LD_LIBRARY_PATH/system/lib export LD_LIBRARY_P…

fasync驱动异步通知机制

fasync简介 编辑异步通知fasync应用于系统调用signal和sigaction函数,简单的说,signal函数就是让一个信号与与一个函数对应,每当接收到这个信号就会调用相应的函数。[1]那么什么是异步通知?异步通知类似于中断的机制,当…

Linux中最常见命令总结

Linux中最常见命令总结 基础命令 命令使用格式 命令名【选项参数】 【操作对象】Ls -a workspace目录命令 Ls 默认显示浏览当前文件目录 -a 显示所有文件,不忽略以点开头的文件 Linux下以.开头的文件是隐藏文件 每个目录下文件的两个特殊目录 . 表示目录自身…

不带头结点的链表基础操作(初始化,增删改查)

链表是什么? **链表是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。链表由一系列结点(链表中每一个元素称为结点)组成,结点可以在运行时动态生成。每个结点包括…

fcntl的使用

功能描述&#xff1a;根据文件描述词来操作文件的特性。 #include <unistd.h> #include <fcntl.h> int fcntl(int fd, int cmd); int fcntl(int fd, int cmd, long arg); int fcntl(int fd, int cmd, struct flock *lock); [描述] fcntl()针对(文件)描述符提供控…

链表面试题1:反转单链表,不带头结点。

三个指针p1,p2,p3&#xff0c;p1指向头结点的前一个结点&#xff0c;也就时指空&#xff0c;p2指向头结点&#xff0c;p3指向头结点下一个结点。 p3指向p2的下一个&#xff0c;让p2指针域指向p1&#xff0c;让p1挪到p2上&#xff0c;再让p2指向p3.

dup/dup2函数的用法

系统调用dup和dup2能够复制文件描述符。dup返回新的文件文件描述符&#xff08;没有用的文件描述符最小的编号&#xff09;。dup2可以让用户指定返回的文件描述符的值&#xff0c;如果需要&#xff0c;则首先接近newfd的值&#xff0c;他通常用来重新打开或者重定向一个文件描述…

链表面试题2:编写代码,以给定值x为基准将链表分割成两部分,所有小于x的结点排在大于或等于x的结点之前

我们可以&#xff0c;用两个新链表&#xff0c;一个存比基准值大的&#xff0c;另一个存比基准值小的。然后再拼接在一起。 用尾插的方法&#xff0c;首先说小的&#xff0c;创建两个指针&#xff0c;一个头&#xff0c;一个尾&#xff0c;再创建个指针跑链表&#xff0c;扫描…

文件系统缓存dirty_ratio与dirty_background_ratio两个参数区别

这两天在调优数据库性能的过程中需要降低操作系统文件Cache对数据库性能的影响&#xff0c;故调研了一些降低文件系统缓存大小的方法&#xff0c;其中一种是通过修改/proc/sys/vm/dirty_background_ration以及/proc/sys/vm/dirty_ratio两个参数的大小来实现。看了不少相关博文的…

栈和队列的基本操作(栈和队列的区别)

数据结构中的栈与内存中的栈的不同 一、数据结构中的堆栈 在数据结构中的堆栈&#xff0c;实际上堆栈是两种数据结构&#xff1a;堆和栈。堆和栈都是一种数据项按序排列的数据结构。 1.栈就像装数据的桶或箱子 我们先从大家比较熟悉的栈说起吧&#xff0c;它是一种具有后进先…

Linux I/O 调度方法

操作系统的调度有 CPU调度 CPU scheduler IO调度 IO scheduler IO调度器的总体目标是希望让磁头能够总是往一个方向移动,移动到底了再往反方向走,这恰恰就是现实生活中的电梯模型,所以IO调 度器也被叫做电梯. (elevator)而相应的算法也就被叫做电梯算法. 而Linux中I…

编译libcurl

1.下载源码后&#xff0c;执行./buidconf产生configure配置文件 2.通过build.sh来设定configure 配置的参数 #!/bin/sh # export CFLAGS-O3 -w -isystem /home/xuxuequan/Ingenicwork/toolchain/mips-gcc472-glibc216-32bit/mips-linux-gnu/libc/usr/include export CPPFLAGS…

链表面试题3:将两个有序链表合并为一个新的有序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成 的。

链表面试题3&#xff1a;将两个有序链表合并为一个新的有序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成 的。 首先我们的思想是将得一个链表和第二个链表的每个结点进行比较&#xff0c;谁小谁就插入到新链表的最后。 首先我们要判段链表是否为空&#xff0c;…

gcc编译参数-fPIC的一些问题

ppc_85xx-gcc -shared -fPIC liberr.c -o liberr.so-fPIC 作用于编译阶段&#xff0c;告诉编译器产生与位置无关代码(Position-Independent Code)&#xff0c;则产生的代码中&#xff0c;没有绝对地址&#xff0c;全部使用相对地址&#xff0c;故而代码可以被加载器加载到内存的…

双向链表的操作(创建,插入,删除)

双向链表的代码看似复杂&#xff0c;其实很简单&#xff0c;只要画图便可明白&#xff0c; 删除 假如要删除的结点叫pos. pos->prev->nextpos->next; pos->next->prevpos->prev; free(pos);

我使用过的Linux命令之hwclock - 查询和设置硬件时钟

我使用过的Linux命令之hwclock - 查询和设置硬件时钟 本文链接&#xff1a;http://codingstandards.iteye.com/blog/804830 &#xff08;转载请注明出处&#xff09; 用途说明 hwclock命令&#xff0c;与clock命令是同一个命令&#xff0c;主要用来查询和设置硬件时钟&#x…

二叉树的操作(前,中,后序遍历也叫深度优先遍历,非空结点的个数)递归实现

定义一个二叉树的结点 二叉树的前序遍历&#xff0c; 先访问根结点&#xff0c;再访问左&#xff0c;再访问右。 每次访问都要先看根结点是否为空&#xff0c;然后打印根结点&#xff0c;把此时根结点的左结点作为下一次递归的根结点&#xff0c;当把左结点遍历完后&#xff0…

makefile编译问题记录

1.-c选项和-C选项&#xff1a; -c&#xff08;gcc选项&#xff09;&#xff1a;编译.c或汇编源文件&#xff0c;但是不作连接. 编译器输出对应于源文件的目标文件. 如&#xff1a;$(CC) -c ${CFLAGS} ${SRCS} -C&#xff08;makefile选项&#xff09;&#xff1a;-C的是make…

二叉树的相关题(叶子结点个数,最大深度,找特殊值结点(值不重复),判断两个树是否相同,判断两个数是否为镜像树,是否为子树,)

叶子结点就是没有孩子结点&#xff0c;所以当当前根结点没有孩子结点的时候&#xff0c;就返回1&#xff0c;就是找到一个叶子结点&#xff0c;然后访问完每个不为空的结点就行&#xff0c;每次访问都是把当前结点的左/右结点作为新的结点&#xff0c;来判断。 求最大深度&…