首页 > 其他分享 >关于C语言的指针结合律

关于C语言的指针结合律

时间:2023-04-18 13:57:46浏览次数:27  
标签:函数 指向 int C语言 说明 数组 结合律 指针

转载一下巩固下理解

一、指针的优先级
括号()的优先级最高,其次是数组[],然后是剩余的*,最后是类型。指针p与优先级高的先结合,对于比较复杂的指针,结合后就视为一个整体temp,然后再与剩下的结合进行分析,慢慢看例子就明白了。

如:(这些例子也不用全部看懂,这里知道优先级就行,然后看了后面的内容再返回来看这些例子,就会容易得多)

int p; // p是一个普通的int型变量
int *p; // p先与*结合,后与类型结合,所以p是一个指针,指针指向的内容是int型
int p[3]; // p先与[]结合,然后与类型结合,说明p是一个数组,数组里面的内容是int型
int *p[3]; // p先与[]结合,说明p是一个数组,然后再与*结合,说明数组p里面存放的是指针,然后与类型结合,说明指针指向的内容是int型,p是一个由返回整型数据的指针所组成的数组
int (*p)[3]; // ()的优先级最高,(*p)说明p是一个指针,然后与数组[3]结合,说明指针指向的是大小为3的一个数组,然后与类型结合,说明指针所指向的数组里面的内容为int型,p是一个指向由整型数据组成的数组的指针
int **p; // p先和最近的*结合,说明p是一个指针,然后再与剩下的*结合,说明指针p指向的是一个指针,然后与int结合,说明指针p所指向的指针(*p)所指向的内容(**p)为int型
int p(int); // p先于(int)结合,说明这是一个函数,函数的参数为int型,然后与外面的int结合,说明函数返回的内容是int型
int (*p)(int); // ()的优先级最高,(*p)说明p是一个指针,然后与(int)结合,说明指针所指向的内容是函数,函数的参数为int型,然后与外面的int结合,说明指针p所指向的内容(*p)是一个函数,该函数的返回内容为int型
int *(*p(int))[3]; // 一层一层的剥开,p首先与(int)结合,说明p是一个函数(这里说了p是一个函数),函数的参数为int型,然后与*结合,说明函数返回的是一个指针,然后与数组[3]结合,说明是返回的指针指向的是一个数组,然后与*结合,说明数组里面的内容是指针,然后与外面的int结合,说明数组里面的指针指向的内容是int型。所以p是一个参数为int型并且返回的是一个指向内容为int*型的数组的函数,由于int*是指针,指针指向的内容为int型,所以p返回的就是一个指向内容为指向内容为int型的指针的数组的函数(太绕了,注意段句)

 


1
2
3
4
5
6
7
8
9

int *(*p(int))[3]; // 这个过于复杂,再来一遍
// 括号里面的内容是一个整体,直接把(*p(int))替换为ptr,那么表达式就变成了
int *ptr[3]; // 这就简单多了,通过上面的例子可以知道,ptr是一个数组,数组里面的内容为指针,指针指向的内容为int型,即ptr是一个内容为指向内容为int型的数组
*p(int); // 同样通过上面的例子可以知道p是一个函数,函数的参数为int型,函数的返回内容是指针
// 下面就把他们结合起来
int *(*p(int))[3]; // p是一个函数,函数的参数为int型,函数的返回内容是一个指针,该指针指向的内容是一个数组,数组里面的内容为指针(该指针指向的内容为int型)
1
2
3
4
5
6

 


二、指针的类型
看一个指针的类型,直接把指针的名字去掉,剩下的就是指针的类型。

如:

int p; // 去掉p,p是一个普通的int型变量
int *p; // 去掉p,说明指针的类型是int *型
int p[3]; // 去掉,说明p的类型为int [3],是一个普通的数组
int *p[3]; // 去掉p,说明指针的类型是int *[3]型
int (*p)[3]; // 去掉p,说明指针的类型是int (*)[3]型
int **p; // 去掉p,说明指针的类型是int **型
int p(int); // 去掉p,剩下int (int),是一个普通的函数
int (*p)(int); // 去掉p,说明指针的类型是int (*)(int)型
int *(*p(int))[3]; // 去掉p,说明指针的类型是int *(*(int))[3]型
1
2
3
4
5
6
7
8
9

 


三、指针所指向的类型
要知道指针所指向的类型,把指针的名字和*去掉,剩下的就是指针所指向的类型。注意优先级。

int *p; // 去掉p和*,说明指针所指向的类型是int型
int *p[3]; // 因为[]的优先级高,所以p先和[3]结合,说明p是一个数组,再与*结合,说明这是一个指针数组,所以这里首先将p[3]去掉,然后再去掉*,剩下int,所以指针数组p[3]里面的元素所指向的内容为int型
int (*p)[3]; // 去掉p和*,说明指针所指向的类型是int [3]型,所以指针p指向的是大小为3的int型数组
int **p; // 去掉p和*,说明指针所指向的类型是int *型
int (*p)(int); // 去掉p和*,说明指针所指向的类型是int (int)型,所以指针p指向的是参数为int的函数,函数的返回类型为int型
int *(*p(int))[3]; // 因为()优先级高,p和(int)结合,说明p是一个函数,然后与*结合,说明函数的返回类型是一个指针,所以这里应该直接把(*p(int))去掉,剩下int *[3],所以函数p返回的是一个指向int *[3]型的指针
1
2
3
4
5
6

 


四、指针的值
指针的值就很简单了,指针本身的值就是一个地址,在32 位程序里,所有类型的指针的值都是一个 32位整数。在分析一个指针的时候应该分析指针的类型是什么?该指针指向了哪里?指针指向的是什么类型的数据?

原文链接:https://blog.csdn.net/qq_43715171/article/details/121876203

标签:函数,指向,int,C语言,说明,数组,结合律,指针
From: https://www.cnblogs.com/mokongking/p/17329296.html

相关文章

  • C语言函数大全-- k 开头的函数
    C语言函数大全本篇介绍C语言函数大全--k开头的函数1.kcalloc1.1函数说明函数声明函数功能void*kcalloc(size_tn,size_tsize,gfp_tflags);它是Linux内核中的一个函数,用于在内核空间分配一块连续的指定大小的内存,它与标准库函数calloc()的功能类似。......
  • c语言rand函数和srand函数的使用
    rand函数介绍rand()函数用来产生随机数,但是,rand()的内部实现是用线性同余法实现的,是伪随机数,由于周期较长,因此在一定范围内可以看成是随机的。它可以随机的产生0~ RAND_MAX(至少是32767) 的随机数(整数),定义类型不同最大值也不同,rand函数包含在头文件stdlib.h中,RAND_MA......
  • Go笔记(八):指针
    1、指针在Go中,指针的操作有两个符号:&(取地址)和*(变量指针的声明|取指针变量的值)。一个指针变量指向了一个值的内存地址。Go中函数传值皆为值拷贝,对于引用类型的传值,可以创建一个指针变量,无需拷贝数据。Go中,类型指针不能进行偏移和运算。2、指针地址和指针......
  • C语言--循环结构--练习
    先来两道题练练手1、编写代码,演示多个字符从两端移动,向中间汇聚。#include<stdio.h>#include<string.h>#include<windows.h>#include<stdlib.h>intmain(){ chararr1[]="WelcometoChina!!!!!!"; chararr2[]=""; in......
  • C#指针读写结构体,效率高
    fixed(int*p1=&point.x){fixed(double*p2=&arr[5]){//Dosomethingwithp1andp2.}}fixed语句禁止垃圾回收器重定位可移动的变量。fixed语句只能出现在不安全的上下文中。Fixed还可用于创建固定大小的缓冲区。fixed语句设置指向托管变量的指针,并在执......
  • 编程打卡:C语言趣味编程习题做
    编程打卡:C语言趣味编程习题做数制转换问题描述给定一个M进制的数x,实现对x向任意非M进制的数的转换。设计思路输入M进制的数x,将x转换为十进制数,再将十进制数转换为任意非M进制的数。流程图graphA["开始"]-->B["输入M进制的数x"]-->C["将x转换为十进制数"]-->D["将十进......
  • C语言函数大全-- j 开头的函数
    C语言函数大全本篇介绍C语言函数大全–j开头的函数1.j0,j0f1.1函数说明函数声明函数功能doublej0(doublex);计算x的第一类0阶贝塞尔函数(double)floatj0f(floatx);计算x的第一类0阶贝塞尔函数(float)【笔者本地windows环境,无此函数】注意:如......
  • 菜鸟记录:c语言实现PAT甲级1004--Counting Leaves
    好消息:与上题的Emergency是同样的方法。坏消息:又错了&&c++真的比c方便太多太多。Afamilyhierarchyisusuallypresentedbyapedigreetree.Yourjobistocountthosefamilymemberswhohavenochild.InputSpecification:Eachinputfilecontainsonetest......
  • c语言趣味编程(1)百钱百鸡
    一、问题描述百钱买百鸡问题:公鸡五文钱一只,母鸡三文钱一只,小鸡三只一文钱,用100文钱买100只鸡,公鸡、母鸡、小鸡各买多少只二、设计思路(1)定义三个变量下x,y,z代表公鸡,母鸡,小鸡的数量;(2)令公鸡的数量从0开始加,利用嵌套循环,内层母鸡数量从0开始增加,最内层小鸡数量从0开始增加;(3)令......
  • C语言关于指针
     //指针变量就是记录地址的变量/**inti;int*p=&i;*表示p是一个指针,指向的是int,现在把i的地址交给p(也叫p指向i)int*p,q;这一行和下一行都是表示p是指针指向int,而q只是一个普通的int类型的变量*p是一个int,不管*靠近int还是p......