int main(void){ int a[3] = {1,2,3}; int *p = a; printf("%d ", p[0]); return 0;} 這段代碼編譯和運(yùn)行都沒有任何問題,程序會打印出1這個(gè),但是為什么可以這樣用呢?p明明">

日本搞逼视频_黄色一级片免费在线观看_色99久久_性明星video另类hd_欧美77_综合在线视频

國內(nèi)最全I(xiàn)T社區(qū)平臺 聯(lián)系我們 | 收藏本站
阿里云優(yōu)惠2
您當(dāng)前位置:首頁 > 互聯(lián)網(wǎng) > C語言指針――指針和數(shù)組

C語言指針――指針和數(shù)組

來源:程序員人生   發(fā)布時(shí)間:2014-10-12 20:00:12 閱讀次數(shù):3332次
    先看一個(gè)常用的例子:
#include <stdio.h>
int main(void)
{
    int a[3] = {1,2,3};
    int *p = a;
    printf("%d ", p[0]);
    return 0;
}
    這段代碼編譯和運(yùn)行都沒有任何問題,程序會打印出1這個(gè)值,但是為什么可以這樣用呢?p明明是一個(gè)int類型的指針,這里怎么可以使用p[0]這種數(shù)組的操作呢?而且我們使用sizeof去測試a和p得到的一個(gè)是a數(shù)組的大小,一個(gè)是p指針的大小,這兩個(gè)類型是不一樣的。其實(shí)這個(gè)是C語言內(nèi)部的原因,一個(gè)指針變量在使用類似p[]這樣的運(yùn)算的時(shí)候,編譯器內(nèi)部相當(dāng)于對p做了一次類型提升,將p其提升為該類型的數(shù)組,注意這里僅僅會提升一次哦!看下面的例子:
#include <stdio.h>
int main(void)
{
    int a[3][3] = {1,2,3,4,5,6,7,8,9};
    int *p = (int *)a;
    printf("%d ", p[0]);
    return 0;
}
    首先需要注意的是,(int *)這個(gè)是必不可少的,因?yàn)閕nt型二維數(shù)組的首地址是不能直接賦值給int *變量的。其次這段代碼也是可以正常輸出1的,這個(gè)程序的理解跟上一個(gè)類似。再看下面一個(gè)代碼:
#include <stdio.h>
int main(void)
{
    int a[3][3] = {1,2,3,4,5,6,7,8,9};
    int *p = (int *)a;
    printf("%d ", p[0][0]);
    return 0;
}
    這段代碼編譯或者運(yùn)行的時(shí)候會出錯(cuò)嗎?答案是編譯的時(shí)候會報(bào)錯(cuò),因?yàn)閜是一個(gè)int類型的指針,使用[]這種運(yùn)算的時(shí)候編譯器會將其提升一次,僅僅是一次,所以p最多會被提升到一維數(shù)組的程度,然而這里的p[0][0]這樣的操作顯然是針對二維數(shù)組的,編譯器不允許這樣的用法。再看下面的例子:
#include <stdio.h>
int main(void)
{
    int a[3][3] = {1,2,3,4,5,6,7,8,9};
    int (*p)[3] = a;
    printf("%d ", p[0][0]);
    return 0;
}
    注意這個(gè)例子,編譯和運(yùn)行都不會出錯(cuò),因?yàn)閜是一個(gè)數(shù)組指針,a直接賦值給p也不會出錯(cuò),這里也說明,數(shù)組在給該類型的指針賦值的時(shí)候,編譯器默認(rèn)最多降一級,也就是說一維數(shù)組給指針直接賦值編譯器允許,二維數(shù)組給該類型的數(shù)組指針賦值編譯器允許,但是跨過兩級就不行了,就像上一個(gè)例子。同時(shí)從這里也可以看出,p[0][0]這樣的操作是允許的,p被提升為二維數(shù)組,p也是被提升了一級。這段代碼會打印出1。再看下面的例子:
#include <stdio.h>
int main(void)
{
    int a[3][3] = {1,2,3,4,5,6,7,8,9};
    int (*p)[3] = a;
    printf("%d ", p[1]-p[0]);
    return 0;
}
    這段代碼的編譯和運(yùn)行都沒有出錯(cuò),打印的值是多少呢?首先來分析一下這個(gè)程序,p[1]中的p表示的是一個(gè)數(shù)組指針,然而使用p[]這種操作,p會被提升一級成為一個(gè)二維數(shù)組的形式,那么p[1]就相當(dāng)于a[1],p[0]就相當(dāng)于a[0],那么a[1]-a[0]的值是多少呢?a[1]是二維數(shù)組a中第二個(gè)[3]一維數(shù)組的首地址,而a[0]是a中第一個(gè)[3]一維數(shù)組的首地址,所以兩個(gè)首地址之間相差sizeof(int)*3,然而由于這里是指針(地址)的運(yùn)算,所以這里的值應(yīng)該是(sizeof(int)*3)/sizeof(int),所以最終的輸出結(jié)果為3。再看下面的代碼:
#include <stdio.h>
int main(void)
{
    int a[3][3] = {1,2,3,4,5,6,7,8,9};
    int (*p)[3] = a;
    printf("%d ", *p[0]);
    return 0;
}
    這段代碼會輸出什么呢?答案是輸出1。首先需要知道的是[]運(yùn)算的優(yōu)先級高于*運(yùn)算符,然后p[0]代表的是a[0]也就是第一個(gè)一維數(shù)組的首地址,然后使用*(地址)這種寫法的時(shí)候,取的是這個(gè)地址的值,所以也就是a[0][0]的值,因?yàn)閍[0]=&a[0][0]。再看下面的例子:
#include <stdio.h>
int main(void)
{
    int a[3][3] = {1,2,3,4,5,6,7,8,9};
    int (*p)[3] = a;
    printf("%d ", *(p+1)[0]);
    return 0;
}
    這段代碼會輸出什么呢?答案是4。首先p是一個(gè)數(shù)組指針,所以p+1的運(yùn)算對應(yīng)過去編譯器理解是指到下一個(gè)一維數(shù)組的首地址,所以p+1實(shí)際上的值為p+1*sizeof(int)*3,后面的理解就跟上面的相同了。
生活不易,碼農(nóng)辛苦
如果您覺得本網(wǎng)站對您的學(xué)習(xí)有所幫助,可以手機(jī)掃描二維碼進(jìn)行捐贈
程序員人生
------分隔線----------------------------
分享到:
------分隔線----------------------------
關(guān)閉
程序員人生
主站蜘蛛池模板: 91精品国产福利一区二区三区 | 综合精品久久 | 亚洲高清中文字幕 | 麻豆传媒在线观看 | 一区在线播放 | www.夜夜骑.com | 成人在线综合网 | 国产日韩亚洲 | 五月婷综合 | 日韩精品一区二区三区中文在线 | 激情久久网 | 最近的中文字幕在线看 | 国产精品一 | 日韩精品 | 51社区在线成人免费视频 | 在线播放国产精品 | 成人免费在线观看 | 久久精品免费播放 | 欧州一区| 亚洲成人午夜电影 | 欧美少妇一区二区 | 亚洲综合一区二区三区 | 亚洲av毛片一区二区三区电影 | 黄色在线观看网址 | 国产一区二区不卡 | 久久er99热精品一区二区 | 日韩精品久久久久 | 国产视频99| 国产成人免费网站 | av三级在线播放 | 在线免费成人 | 成人欧美一区二区三区黑人孕妇 | 日韩在线观看视频免费 | 毛片免费观看视频 | 午夜激情视频在线观看 | 男人午夜影院 | 激情欧美亚洲 | 久久一精品 | 九九热久久免费视频 | 99成人免费视频 | 日韩精品久久久久 |