数组指针和指针数组和二重指针

数组指针和指针数组从字面上来看很纠结,有时候我也搞不清,分不清哪样的是数组指针,哪样的是指针数组。这东西就不是靠记忆的,我们采取分析加对比分层剥离的方法分析。

1.概念区别 
1.1.数组指针:定语在前,主语在后。也就是数组的指针。一个指针,它指向一个数组。 
1.2.指针数组:定语在前,主语在后。也就是指针 的数组。一个数组,里面的元素都是指针。

2.指针和数组分别定义的符号 
2.1 int * p; 
分析: 
第一步:找核心,核心是p。 
第二步:逐层剥离,p和*结合是指针。所以int*p;是定义了一个指针

2.2. int p[5]; 
分析: 
第一步:找核心,核心是p。 
第二步:逐层剥离,p和[]结合是数组。所以int p[5];是定义了一个数组。

3.指针数组和数组指针分别定义的符号 
3.1 int * p[5] 
分析: 
第一步:找核心,核心是p。 
第二步:逐层剥离,这时候p先和[]结合还是先和*结合,查优先级表得到[]优先级更高。所以p先和[]结合成为数组。 
第三步:继续逐层剥离,p[5]这个数组再和*结合 
第四步:得到结果,有一个数组有5个元素,其元素都是指针,即指针数组。

3.2. int (* p)[5]; 
分析: 
第一步:找核心,核心是p。 
第二步:逐层剥离,p和谁结合?小括号优先级更高,所以p先和*结合成为指针, 
第三步:继续逐层剥离,*p这个指针再和数组结合, 
第四步:得到结果,有一个指针,该指针指向一个数组,即数组指针。

4.一维指针int * 和数组指针int (*)[]的类型匹配问题 
4.1. 
int * p; 
int a[5]; 
p = a; //类型匹配吗?

别怕,我们来分析 
(1)p和结合是指针,再和int结合,说明,p是一个指向int类型变量的指针,类型为int 
(2)a是数组名,a做右值表示数组首元素的首地址,首元素是int类型,首元素的地址是int*类型。 
(3)得出结论,p和a类型一致。都是int*类型的。

4.2. 
int * p; 
int a[5]; 
p = & a; //类型匹配吗?

我们再来分析 
(1)p和结合是指针,再和int结合,说明,p是一个指向int类型变量的指针,类型为int 
(2)a是数组名,&a做右值表示整个数组的首地址,也就是一个指向数组的指针,即数组指针,其类型为 int(*)[] 
(3)第三步:得出结论,p和&a类型不匹配,p的类型是int*,&a的类型是int(*)[]

5.二维指针int * * p1;和指针数组 int*p2[5];(实际中用的比较少,如果用到二维指针肯定是和指针数组连用) 
5.1.指针数组 
int *p[5];

分析: 
第一步:p先和[]结合是数组,再和*结合,也就是数组里面的元素都是指针,也就是说,数组中的元素,p0,p1,p2,p3,p4,都是指针,那数组名p是什么类型? 
第二步:数组名p做右值时表示整个数组的首地址,整个数组都是指针,那p就是指针的指针了,即p的类型是指向指针的指针,二重指针。 
重要:二重指针就是指针数组指针 
分析能力是很重要的,比学到知识本身重要,我们永远不能学完所有的知识,但我们可以提高学习的效率。 学习本身比学习更总要。

时间: 2024-10-25 21:23:57

数组指针和指针数组和二重指针的相关文章

指针与一维数组和二维数组以及字符串指针数组的学习笔记

废话不多少,直接上代码,关键的东西已经注释了,看注释信息理解即可. 说明:本程序讨论了一维数组和指针的关系,谈论了二维数组和指针之间的关系,讨论了字符串数组指针数组和指针之间的关系,代码中以给出定义的方法和简单的使用,但是有些使用方法并没有列出,如果需要, 请自行加入printf调试即可. 转贴请注明出处,欢迎和我讨论,谢谢. ----------cofin_add #include <stdio.h> void fun(int m, char *((*p)[m])){ int i = 0;

指针做参数的动态内存分配与二重指针(上)

C中的动态内存分配问题: 格式:Int *pointer; Pointer = (int *)malloc(100 * sizeof(int)); 可以在被调用函数(该函数返回指针的函数)中动态分配内存,(并且该内存是分配在堆内存中的,故而被调函数可以返回指向该堆内存的指针),然后返回该指针值,该指针指向动态分配的内存,然后可以在主函数中free掉pointer.哪怕在主函数中将该指针值赋值给pointer_2,free掉pointer_2也是可以的,(可以理解的,它们都指向该堆内存),以避免出

C基础--二重指针和数组指针

#include <stdio.h> int main1(void) { int a = 3; int b = 8; int *p = &a; // int* p = &a; int **q; // int** q; q = &p; **q = 10; *q = &b; **q = 5; p = &b; *p = 9; printf("a = %d\tb = %d\n", a, b); return 0; } //void fun(c

指针数组,数组指针,函数指针,main函数实质,二重指针,函数指针作为参数,泛型函数

 1.指针数组 数组里面的每个元素都是指针. 指针数组的案例如下: 易犯错误: 2.数组指针 归根结底还是指针,只是取*的时候能够取出一整个数组出来. 数组指针:(一个指针指向了数组,一般和二维数组搭配使用). 下面的(p+1)表示的是加过20个字符. 3.函数指针: 在gcc编译的时候增加一些调试信息的方式是: gcc demo.c –g –o app   -g表示增加一些调试信息 objdump –dSsx app > file   将app反汇编,然后重定向到file文件中.函数指针定

二维数组与二重指针

1.二重指针 1.1应用场景(1)二重指针编程中多数是和指针数组结合起来用 int **p1; int *p2[5]; p1=p2; (2)有时在函数传参时通过函数内部改变外部的一个指针变量,会以二重指针的方式把这个外部指针变量的地址传进去. void func(int **p) { *p = (int *)0x22222222; } int main(void) { int a=10; int *p3=&a; printf("change before=%p.\n.",p);

第一次作业 使用指针完成对数组的遍历

#include <stdio.h>int main(){ int a[10]={1,2,3,4,5,6,7,8,9,10};//学号为6 故定义a[10] int *p;//定义指针 for(p=a;p<(a+10);p++)//定义一个for循环 减少步骤遍历数组a printf("%d\n",*p);//利用指针输出数组 } 总结: 1.要认真查看每一个字符,用到数组的定义,指针的定义 2.通过使用for循环进行数组的遍历,提高效率 3.变量的指针是变量的地址,

字符指针与字符数组

学了挺久的c语言,c语言有意思的就有指针这一大块,另外就是字符串,字符指针与字符数组的区别对于初学者应该是比较难以区分的,讲讲自己的看法. 1.定义上的区别 字符数组具有固定的地址,且字符数组的名字不能更改或运算. 字符指针是一个变量,用来存储首字符的地址,且指向的字符串通常为一个常量. char str[] = "helloworld"; str[4] = 'X'; printf("%s",str); 输出结果:hellXworld char *str = &qu

int?(*p)[4]?p?是二级指针?二维数组?二级指针?.xml

pre{ line-height:1; color:#2f88e4; background-color:#e9ffff; font-size:16px;}.sysFunc{color:#3d7477;font-style:italic;font-weight:bold;} .selfFuc{color:#a0b684;} .bool{color:#86ddd8;} .condition{color:#94e269;font-weight:bold;} .key{color:#ae0bfd;} .

C 字符串指针与字符数组的区别

用字符数组和字符指针变量都可实现字符串的存储和运算.但是两者是有区别的.在使用时应注意以下几个问题: 1. [字符串指针变量]本身是一个变量,用于存放字符串的首地址. 而字符串本身是存放在以该首地址为首的一块连续的内存空间中并以'\0'作为串的结束. [字符数组]是由于若干个数组元素组成的,它可用来存放整个字符串. 2. 对字符串指针方式  char *ps="C Language"; 可以写为: char *ps;  ps="C Language"; 而对数组方式