C语言之指针数组和数组指针

C  2023年8月22日 am8:08发布1年前 (2023)更新 城堡大人
123 1 0

前言

简单记录一下指针数组数组指针之间的区别。

正文

由于很容易搞混,因此这里做一下记录。

指针数组

指针数组是指具有若干个相同存储类型和数据类型的[指针变量]构成的组合。

指针数组的一般形式:

存储类型  数据类型 * 指针数组名 [大小]
//指针数组,类型是int * 所以叫int型指针数组
int * p[n];

// int型数组
int array[n]

[]的优先级比*高,所以p先是一个数组,在int * 组合说明是一个整型指针数组,含有n个指针类型的数组。

数组中存储的就是指针

指针数组:首先它是一个数组,数组的元素都是指针,数组占多少个字节由数组本身的大小决定,每一个元素都是一个指针,在32 位系统下任何类型的指针永远是占4 个字节。它是“储存指针的数组”的简称。

#include<stdio.h>

int main(){
    int a[2][2]= {{1,2},{3, 4}};

    for( int i=0; i< 2; i++){
            for( int j=0; j< 2; j++){
            printf("%d \n ", a[i][j]);
            }
    }

    printf("\n");

    int * q[2];

    q[0] = a[0];
    q[1] = a[1]; //不指定q[1]就没法查询到a[1]的内容


    for( int i=0; i< 2; i++){
            for( int j=0; j< 2; j++){
                    printf("%d \n ", q[i][j]);
            }
    }
    return 0;
}

输出结果:

 1
 2
 3
 4

 1
 2
 3
 4

数组指针

行指针,也就数组指针。存储行地址的指针叫行指针变量。

一般的形式如下:

存储类型  数据类型 (* 行指针变量)[大小]

比如:

int (*p)[n];

()的优先级比[]高,说明p是一个指针,指向一个整型的一为数组,这个一维数组大小为n。

数组指针:首先它是一个指针,它指向一个数组。在32 位系统下任何类型的指针永远是占4 个字节,至于它指向的数组占多少字节,不知道,具体要看数组大小。它是“指向数组的指针”的简称。

个人觉得,数组指针,可以看成存在类型为int的二维数组

#include<stdio.h>

int main(){
    int a[2][2]= {{1,2},{3, 4}};

    for( int i=0; i< 2; i++){
            for( int j=0; j< 2; j++){
            printf("%d \n ", a[i][j]);
            }
    }

    printf("\n");
    int (*p)[2]; //类型为int的数组指针
    p =a ;
    for( int i=0; i< 2; i++){
            for( int j=0; j< 2; j++){
                printf("%d \n ", p[i][j]);
            }
    }

    return 0;
}

输出的结果:

 1
 2
 3
 4

 1
 2
 3
 4

小结:

  1. 数组指针和指针数组赋值存在一定的区别。

指针数组:

int * q[2]; // 存储的类型为int *指针

q[0] = a[0];
q[1] = a[1]; //不指定q[1]就没法查询到a[1]的内容

数组指针:

int (*p)[2]; //类型为int的数组指针
p =a ;
  1. ()的优先级比[]高,[]比*高,所以导致存储的类型不一样。

PS 以上面例子

指针数组:存放的是int *
数组指针:存放的是int

谁的优先级高就读法就放在后面,比如指针数组中[]的优先级高于*;比如数组指针中的(int *)高于[]。

  1. 如果指针在最后,说明这个是指针,用于指向某个地址的;
  2. 如果数组在最后,说明这个是数组,用于存储指针的数组,数组类型为int *;

参考文章

  1. 数组指针和指针数组的区别

 历史上的今天

  1. 2020: 查询android机器对应的api版本和硬件相关信息(0条评论)
  2. 2019: 张承志:听人读书(0条评论)
版权声明 1、 本站名称: 笔友城堡
2、 本站网址: https://www.biumall.com/
3、 本站部分文章来源于网络,仅供学习与参考,如有侵权,请留言

1 条评论

  • 改变自己
    改变自己 管理员

    (1)如果指针在最后,比如数组指针,说明这个是指针,用于指向某个地址的;(2)如果数组在后,说明这个是数组,用于存储指针的,也就是数组类型为int *

    回复

随机推荐

蒋勋 : 孤独的乐趣

与孤独相处的时候,可以多一点思维的空间,生命的过程会不会更细腻一点?——蒋勋禅宗有一则有趣的故事,小徒弟整天跟老师父说:“我心不安,我心不安。”他觉得心好慌,上课没有心上课,做功课没有心做功课,问老师父到底该怎么办?师父拿出一把刀,说:“心拿出来,我帮你安一安。”心一直在自己身上,心会不安,是被...

陈独秀:人生的真义

人生在世,究竟为的甚么?究竟应该怎样?这两句话实在难得回答的很,我们若是不能回答这两句话,糊糊涂涂过了一生,岂不是太无意识吗?自古以来,说明这个道理的人也算不少,大概约有数种:第一是宗教家,像那佛教家说:世界本来是个幻象,人生本来无生;“真如”本性为“无明”所迷,才现出一切生灭幻象;一旦“无明”灭,...

开机动画文件制作以及注意事项

推荐使用 读书导航 极客导航 :125啦极客导航(http://www.biumall.com/jike.html)PS:红色字体需要特别注意刚刚将原生Android系统开机logo和开机动画做了调整,为此耗费了接近半天的时间,碰到了很多问题,幸好最终达成了目的。一,首先说一下bootanim...

三毛:说给自己听

如果有来生,要做一棵树,站成永恒,没有悲欢的姿势。一半在尘土里安详,一半在风里飞扬,一半洒落阴凉,一半沐浴阳光。非常沉默,非常骄傲。从不依靠,从不寻找。如果有来生,要化成一阵风,一瞬间也能成为永恒。没有善感的情怀,没有多情的眼睛。一半在雨里洒脱,一半在春光里旅行。...

判断Service和Activity的存在

备忘在这,防止下次需要。1、判断服务是否在运行 /** * app service running */ public static boolean appServiceIsRunning(String classname) { if (null == classname...

Thread中断简单介绍

前言简答记录一下Thread中断相关的内容。记录一下,方便自己查阅。正文Thread中断主要涉及如下几个方法:interrupt()isInterrupted()interrupted()下面单独介绍一下。interrupt()interrupt()使线程中断。...