搜索
您的当前位置:首页c语言指针例题解答

c语言指针例题解答

来源:乌哈旅游

首先先给大家讲解下什么是指针数组,什么又是数组指针呢?

eg:char *c[5]因为[]的优先级高于*,所以c先与[]结合形成一个数组,类型为char* 类型,大小为5。里面存放属于char类型的指针。其实数组指针二维指针有一定的相似之处,如果感兴趣,大家可以百度什么是二维指针,在以后的篇幅里,我也会详细给大家解释什么是二维指针,他们的联系是什么,区别又是什么呢?

而对于char(*c)[5]因为()的优先级最高,所以c先和*形成一个指针,然后再与数组结合,这就形成了数组指针,即为指向数组的指针。它指向包含5个char类型元素的一维数组,此时c的增量以它所指向的一维数组长度为单位;

好了 弄懂了数组指针指针数组,那么接下来继续解答该道题。

看这句代码,

char**cp[]={c+3,c+2,c+1,c};

仔细看看,这里的**cp[]比上面的*c多了一个*。不知道大家看到这里有没有点疑惑呢?

多一个*号那他又代表什么呢?我来给大家举一个简单的例子吧。

char a='a';

char *b=&a;

接下来看第一句printf, 参数是**++cpp;;首先大家要知道输出三级指针指向的内容,他两个*又代表什么。

  • 这样**++cpp就代表指针数组c的第三个元素了,是一个字符串“world”,%s接收到这个字符串会把它都输出出来。即第一个printf打印WORLD.

举个简单的例子,给你们提个问题。

int a[5]={1,2,3,4,5}

int *p=a;

p++;//1

a++;//2

这两个哪个正确呢?

1是正确的2是错误的。

要取到里面的元素 * ( p ),* ( p+1 ).…;注意看这里也带个*这个代码的意义是把数组显式转化为一个指针!,再结合图片的第二行和第三行,你现在应该清楚他的作用了吧。对,就是将数组显式转化为一个同维度的指针。。。好累明天继续更博。

哈哈 ,不要困惑了。并不会的。因为c[0]这个字符串 “hello\0”,他会有个默认的'\0'结束符,结束%s的获取。我为什么会问这样的问题。因为要是同样的问题 遇到了二维数组大家想想又是什么样的情况呢?

大家好好对比看下。针对二维数组,让%s获取到c[0]即二维数组的第一行 时,他会把整个二维数组输出出来。直到遇到c[2][2]是个默认的‘\0’结束输出。

通过一个例题 我举出这么多例子。。。。真累。不知道大家能不能理解呢?

  • 接下来回到问题的第三个输出,参数为*cpp[-2]+3。不难理解。可以转化下,切记接下来这个让我受益终身的一句语法糖,*(a+1)等价a[1]当你被指针搞得头大恨不得疯掉的时候一定要想起这句语法糖。我不扯了。回到原题 。根据语法糖法则,把*cpp[-2]+3转化成**(cpp-2)+3。我想通过我这么详细的分析。这道题对大家不再有难度了吧。算了 ,送佛送到西。cpp经过上面两句已经指向了cp[2]这个地址,那么cpp-2指向cp[0]的地址没疑惑吧。然后带个*,即为*(cpp-2)即为cp[0]这个元素,即代表c+3这个地址,然后再带个*号为**(cpp+3),成为c[3]代表的元素。c+3这个地址代表的字符串是“SAYHI”,再+3,即把该字符串的地址再往后移动三位。这样就输出了“HI”。切记*(地址)=该地址指向的值。这句话可以套用。即就是这里面的地址可以是地址的地址。请各位好好理解吧。eg:*(*(地址的地址))

此题结束 。答案选哪个呢?

我再问大家一个问题还是原来的那些数组,删掉那4句printf(这样cpp指针就是初始状态),重新输出一句

printf(“%c”,cpp[1][1][1])

会输出什么呢? 我给个答案 :输出A

printf(“%c”,cpp[1][-1][1])

又输出多少呢?答案:输出E。

请大家好好想想吧!指针的道路就是这样一步一步探索吧。我相信各位勇于尝试最终都能成为C指针高手。


因篇幅问题不能全部显示,请点此查看更多更全内容

Top