黑马程序员C语言教程:技术文档

2022-05-20 03:01:13   文档大全网     [ 字体: ] [ 阅读: ]

#文档大全网# 导语】以下是®文档大全网的小编为您整理的《黑马程序员C语言教程:技术文档》,欢迎阅读!
技术文档,黑马,程序员,语言,教程


希望对大家有所帮助.多谢您的浏览!

指针数组和数组指针详解

指针数组和数组指针

1. 定义

int *p[4]; //泄义了一个指针数组p, p—共有4个单元,每个单元都是一个int型的 指针 int (*p)[4]; //适义了一个数组指针p, p可以指向一个拥有4个单元的int型数组 2. 指针数组的用法 include int mainO

{

int *p[4];

int a 1, b2, c3, d=4; p[0] = &a; p[l] = &b; p[2] = &c; p[3] = &d;

printf C%d %d %d %d\n\ *p[0], *p[l], *p[2], *(p[3])); return 0; }

程序输岀:12 3 4

分析:指针数组的用法比较简单,注意一点*0]*(0])是一样的,因为在C语言中口 的优先级要高于*运算符。

3. 数组指针的用法

数组指针的用法比较复杂,理解相对来说也比较困难,还是需要结合一些实际的例子来一步 的理解。 例子1

int mainO

{

int a 18] = {1, 2, 3, 4, 5, 6, 7, 8}; int *p = a;

printf(”d\n", p[2]); return 0; }

程序输岀结果:3

分析1这是平时在写程序时经常用到的一种写法,但是却隐藏着一些知识点可能平时都没 太注意到。这里P是一个int型的指针,然而在程序中却将p类似于数组来使用,这个怎 么理

授课:XXX






希望对大家有所帮助.多谢您的浏览!

解呢?其实这样写的话,就相当于将P作为基址[2]表示的是相对于基址的偏移,这里 是偏移两P指向类型的单元,也就是得到的a的第三个单元(单元从1开始汁数)的值也就 3。同时记住:a的理解有两种:第一种a表示这8int单元的总称,体现在&a的时候, 这个时候&a的类型为int (*) [8];第二种理解a的值代表的是一个int类型的指针,体现在 a[l]=*(a+1)这种操作中。 例子2

include

int mainO {

int a [8] = {1, 2, 3, 4, 5, 6, 7, 8}; int (*p)[8] = &a;

printf("%p %p ", p, a); 〃这里是用的a的值,所以a体现的是指针的性质 printf (?%d "((*p) [3]));



printf ("%d\n", *p[3]); return 0; }

程序输出:0012FF60 0012FF60 4 1245120

分析2可以看到pa的值输出是一样的,但是要记住这里的pa的类型可是完全不一 的,所以在赋值的时候没有直接将a赋值给p而是用了&a。这里的a是一个int类型的指 针,P是一个int (*) [8]类型的指针,两者直接赋值编译器会报错。第3个输岀的数为4, 也就是

a[3]的值,但是第四个输岀的数明显是一个错误的数据,同时记住不一左每次都是 这个数。这个如何理解呢? P是一个数组指针,所以*p代表的才是a(尽管它们值是一样的) 然而由于□的优先级高于*,所以((*p)[3])才可以取到a[3]的值。然而讥3]根据上而的理 解,是以P为基址,偏移3p指向的单元,然而p此时指向的是数组,所以p指向的是一 8int单元的数组,所以p[3]表示的就是内存区域往后的第4个数组(每个数组拥有8 int单元)的首地址,*3]取到的就是第四个数组的第一个单元的值,虽然这样操作越 界了,但是编译器检査不出

来。

例子3 —个更加复杂的例子

^include int mainO

{

int p[3] [4] [5]; int *q = (int *)p;

int (*s) [5] &p[l] [0]; int i, m;

for(i 0; i q[i] = i; printf (?/%d ", p[l] [7] _1]);printf C%d "(*(s+l) [3]));

授课:XXX






希望对大家有所帮助.多谢您的浏览!

printf ("%d\n", p[l] [7] [1]*(*(s+1) [3])); return 0; }

程序输岀:56 40 2240

分析3这个输岀可能乍一看确实比较奇怪,但是认真分析的话还是可以得到正确结果的。 首先for循环的赋值语句,p数组一个3*4*5=60个单元,而这个for循环分别将这60 单元依次赋值为0~59再看p[l][7][l],操作越界了这个很明显,但是来分析一下这个具 体取的是哪个单元的值:1*20+7*5+156,也就是说相当于取的是q[56]的值,这个值就是 56。比较难理解的就(*(s+l)[3]),不过根据前而的讲解,理解这个也是不难的,s是一 int (*) [5]类型的指针,所以

s+1就会指向下一个数组(每个数组包含5int单元) s+1的值也就相当于是&1][1] 了,然而□运算相当于将前而的作为基址进行偏移,偏移3 个单元(每个单元又是一个数组),所以就相当于&p[l][4],然而由于p的第二维只有最多 3的下标,所以更为准确的说法就是&2][0],然后取这个地址的值,也就是取p[2][0][0] 的值,这个值就是40

(注:可编辑下载,若有不当之处,请指正,谢谢!)

授课:XXX




本文来源:https://www.wddqxz.cn/95f7bb04930ef12d2af90242a8956bec0875a521.html

相关推荐