青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

posts - 297,  comments - 15,  trackbacks - 0

從一道面試題看指針與數(shù)組的區(qū)別

 

 

題記:

    關(guān)于指針,推薦看一下csdn飛天御劍流的《再再論指針》,相信對C語言指針會有一個更為清晰全面的理解。

     指針是C語言的精華,它是一柄雙刃劍,用的好與壞就看使用者的功力了。下面就一道面試題,看一下指針與數(shù)組的區(qū)別。

 char *p1, *p2;
char ch[12];
char **pp;
p1 = ch;
pp = &ch;

p2 = *pp;
p1p2是否相同

     題目如上,找出其中的不妥之處。

     首先,數(shù)組ch是沒有初始化的。其次,一個比較隱含的地方是,數(shù)組名可以代表數(shù)組第一個元素的首地址,這個沒有問題,但是,數(shù)組名并非一個變量,數(shù)組分配完成后,數(shù)組名就是固定的,地址也是固定的。這樣導(dǎo)致的結(jié)果就是絕對不能把數(shù)組名當(dāng)作變量來進行處理。上述題目中,pp=&ch,顯然是把數(shù)組名當(dāng)作指針變量來使用了,這樣肯定出問題。

    這個題目存在的兩個問題,第一個問題比較簡單,可以認(rèn)為是粗心大意。但是第二個問題就是相當(dāng)復(fù)雜了,擴展開來,那就是C語言中的精華中的指針和數(shù)組的聯(lián)系與區(qū)別問題了。

    下面分為兩步,首先看一下指針和數(shù)組的區(qū)別方法,然后提出對上述程序的修改方案。

1 指針和數(shù)組的區(qū)別

1)指針和數(shù)組的分配

    數(shù)組是開辟一塊連續(xù)的內(nèi)存空間,數(shù)組本身的標(biāo)識符(也就是通常所說的數(shù)組名)代表整個數(shù)組,可以使用sizeof來獲得數(shù)組所占據(jù)內(nèi)存空間的大?。ㄗ⒁猓皇菙?shù)組元素的個數(shù),而是數(shù)組占據(jù)內(nèi)存空間的大小,這是以字節(jié)為單位的)。舉例如下:

#include <stdio.h>
int main(void)
{

        char a[] = "hello";
        int b[] = {1, 2, 3, 4, 5};
        printf("a: %d\n", sizeof(a));
        printf("b memory size: %d bytes\n", sizeof(b));
        printf("b elements: %d\n", sizeof(b)/sizeof(int));
        return 0;
}

     數(shù)組a為字符型,后面的字符串實際上占據(jù)6個字節(jié)空間(注意最后有一個\0標(biāo)識字符串的結(jié)束)。從后面sizeof(b)就可以看出如何獲得數(shù)組占據(jù)的內(nèi)存空間,如何獲得數(shù)組的元素數(shù)目。至于int數(shù)據(jù)類型分配內(nèi)存空間的多少,則是編譯器相關(guān)的。gcc默認(rèn)為int類型分配4個字節(jié)的內(nèi)存空間。

 2)空間的分配

    這里又分為兩種情況。

    第一,如果是全局的和靜態(tài)的
    char *p = “hello”;
   
這是定義了一個指針,指向rodata section里面的“hello”,可以被編譯器放到字符串池。在匯編里面的關(guān)鍵字為.ltorg。意思就是在字符串池里的字符串是可以共享的,這也是編譯器優(yōu)化的一個措施。
    char a[] = “hello”;
   
這是定義了一個數(shù)組,分配在可寫數(shù)據(jù)塊,不會被放到字符串池。

    第二,如果是局部的
    char *p = “hello”;
   
這是定義了一個指針,指向rodata section里面的“hello”,可以被編譯器放到字符串池。在匯編里面的關(guān)鍵字為.ltorg。意思就是在字符串池里的字符串是可以共享的,這也是編譯器優(yōu)化的一個措施。另外,在函數(shù)中可以返回它的地址,也就是說,指針是局部變量,但是它指向的內(nèi)容是全局的。
    char a[] = “hello”;
   
這是定義了一個數(shù)組,分配在堆棧上,初始化由編譯器進行。(短的時候直接用指令填充,長的時候就從全局字符串表拷貝),不會被放到字符串池(同樣如前,可能會從字符串池中拷貝過來)。注意不應(yīng)該返回它的地址。

3)使用方法

    如果是全局指針,用于不需要修改內(nèi)容,但是可能會修改指針的情況。
   
如果是全局?jǐn)?shù)組,用于不需要修改地址,但是卻需要修改內(nèi)容的情況。
   
如果既需要修改指針,又需要修改內(nèi)容,那么就定義一個數(shù)組,再定義一個指針指向它就可以了。

2 我編寫的修改方案

[armlinux@lqm pointer]$ cat pointer.c
/*
 * Copyright 2007 (c), Shandong University
 * All rights reserved.
 *
 * Filename : test.c
 * Description: about pointer
 * Author : Liu Qingmin
 * Version : 1.0
 * Date : 2007-08-27
 */
#include <stdio.h>
/*
 * define a macro which is used to debug array mode and pointer mode.
 * if 1, debug array mode; else debug pointer mode.
 * You can change it according to your decision.
 */
#define ARRAY_OR_POINTER 0
int main(void)
{
    char *p1;
    char *p2;
    char **pp;
    //test1
    #if ARRAY_OR_POINTER
    char ch[] = "hello, world!\n";
    printf("%d, %d, %d, %d\n", sizeof(p1), sizeof(p2),
                                           sizeof(pp), sizeof(ch));
    #else
    char *ch = "hello, world!\n";
    printf("%d, %d, %d, %d\n", sizeof(p1), sizeof(p2),
                                           sizeof(pp), sizeof(ch));
    #endif
   
//test2
    p1 = ch;
    #if ARRAY_OR_POINTER
    pp = &p1;
    #else
    pp = &ch;
    #endif
    p2 = *pp;
    if (p1 == p2) {
    printf("p1 equals to p2\n");
    } else {
    printf("p1 doesn't equal to p2\n");
    }
    return 0;
}

 執(zhí)行結(jié)果如下:

 // ARRAY_OR_POINTER0
[armlinux@lqm pointer]$ ./test
4, 4, 4, 4
p1 equals to p2
// ARRAY_OR_POINTER1
[armlinux@lqm pointer]$ ./test
4, 4, 4, 15
p1 equals to p2

 如果使用了數(shù)組定義方式,而又使用pp=&ch,那么就會出現(xiàn)類似下面的錯誤:

 [armlinux@lqm pointer]$ make
gcc -Wall -g -O2 -c -o pointer.o pointer.c
pointer.c: In function `main':
pointer.c:44: warning: assignment from incompatible pointer type
gcc -Wall -g -O2 pointer.o -o test
[armlinux@lqm pointer]$ ./test
4, 4, 4, 15
p1 doesn't equal to p2

 url: http://blog.chinaunix.net/u/21948/showart_374560.html

posted on 2008-08-06 02:47 chatler 閱讀(879) 評論(1)  編輯 收藏 引用 所屬分類: C++_BASIS

FeedBack:
# re: 從一道面試題看指針與數(shù)組的區(qū)別
2008-09-15 11:06 | 路過
一個字,強!  回復(fù)  更多評論
  
<2010年6月>
303112345
6789101112
13141516171819
20212223242526
27282930123
45678910

常用鏈接

留言簿(10)

隨筆分類(307)

隨筆檔案(297)

algorithm

Books_Free_Online

C++

database

Linux

Linux shell

linux socket

misce

  • cloudward
  • 感覺這個博客還是不錯,雖然做的東西和我不大相關(guān),覺得看看還是有好處的

network

OSS

  • Google Android
  • Android is a software stack for mobile devices that includes an operating system, middleware and key applications. This early look at the Android SDK provides the tools and APIs necessary to begin developing applications on the Android platform using the Java programming language.
  • os161 file list

overall

搜索

  •  

最新評論

閱讀排行榜

評論排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            国产欧美日韩专区发布| 欧美日韩亚洲另类| 久久免费的精品国产v∧| 欧美一区二区三区精品| 久久成人在线| 久久另类ts人妖一区二区| 久久亚洲捆绑美女| 免费视频久久| 欧美理论在线播放| 国产精品久久久久久妇女6080| 国产精品白丝av嫩草影院| 国产精品久久精品日日| 国产欧美一区二区在线观看| 国产日产欧产精品推荐色 | 亚洲视频一区在线| 亚洲综合社区| 欧美专区在线| 另类成人小视频在线| 欧美国产专区| 亚洲免费福利视频| 亚洲欧美另类综合偷拍| 性久久久久久久久| 免费在线看成人av| 欧美午夜免费影院| 国产自产v一区二区三区c| 18成人免费观看视频| 日韩午夜剧场| 欧美一区二区三区在线| 卡一卡二国产精品| 91久久精品久久国产性色也91| 亚洲激情精品| 性感少妇一区| 欧美高清视频| 国产欧美日韩91| 亚洲激情啪啪| 午夜亚洲精品| 欧美激情视频一区二区三区在线播放 | 欧美日韩一区二区视频在线观看 | 久久高清国产| 欧美激情中文字幕在线| 国产精品影院在线观看| 亚洲高清二区| 午夜精品福利电影| 欧美激情精品久久久久久黑人| 亚洲精选中文字幕| 久久成人亚洲| 国产精品成人一区二区三区夜夜夜| 国产亚洲日本欧美韩国| 一区二区三区精密机械公司| 久久久久久久久岛国免费| 亚洲老司机av| 久久久久久久高潮| 国产精品理论片在线观看| 亚洲国产成人av在线| 欧美亚洲网站| 亚洲国产日韩一区| 久久久国产精品亚洲一区| 欧美小视频在线| 亚洲精品字幕| 久久综合国产精品台湾中文娱乐网| 日韩一级精品视频在线观看| 久久久一二三| 国产婷婷色综合av蜜臀av| 一本大道av伊人久久综合| 免费国产自线拍一欧美视频| 亚洲欧美不卡| 欧美日韩在线观看一区二区三区 | 男同欧美伦乱| 午夜在线电影亚洲一区| 欧美日韩日本视频| 亚洲国产精品专区久久| 久久成人精品一区二区三区| 日韩视频免费观看高清在线视频| 久久久亚洲影院你懂的| 国产欧美视频在线观看| 亚洲一区二区三区成人在线视频精品| 欧美成人嫩草网站| 欧美在线视频二区| 国产精品系列在线| 亚洲在线视频观看| 日韩视频第一页| 噜噜噜91成人网| 亚洲第一页在线| 久久精品国产免费观看| 午夜精品久久久久久久久| 国产精品国产三级国产aⅴ入口| 亚洲免费观看高清完整版在线观看| 蜜臀久久99精品久久久画质超高清 | 久久国产福利| 国产一区91| 久久久久久久999精品视频| 亚洲在线观看视频网站| 国产精品日本一区二区| 午夜国产欧美理论在线播放| 中国亚洲黄色| 国产精品久久久久aaaa| 亚洲在线不卡| 亚洲一区自拍| 国产欧美一区二区三区国产幕精品| 午夜久久久久久| 亚洲欧美日本在线| 国产亚洲欧美日韩一区二区| 久久狠狠婷婷| 久久精品一本| 亚洲国产精品成人一区二区| 欧美激情精品久久久久久| 欧美88av| 一本色道久久综合精品竹菊| 亚洲九九爱视频| 国产精品成人午夜| 欧美一级成年大片在线观看| 午夜激情久久久| 一区二区三区在线观看欧美| 欧美成人精品一区二区三区| 免费观看成人网| 中文国产成人精品久久一| 亚洲网址在线| 国内精品美女av在线播放| 久久综合999| 欧美成人免费全部| 亚洲天堂网在线观看| 亚洲综合色在线| 精品成人一区二区| 亚洲激情第一页| 国产精品九九久久久久久久| 久久精品99无色码中文字幕| 久久久久久久性| 一区二区三区国产在线| 亚洲一区3d动漫同人无遮挡| 国产喷白浆一区二区三区| 你懂的网址国产 欧美| 欧美精品一卡二卡| 欧美怡红院视频一区二区三区| 久久久久久电影| 一本色道久久| 欧美一区激情| 亚洲乱码精品一二三四区日韩在线| 一本色道久久综合亚洲精品小说| 国产免费观看久久黄| 欧美二区在线看| 国产精品乱人伦一区二区 | 国产欧美精品一区| 欧美黄色影院| 国产精品久久久久久一区二区三区| 久久久久久网站| 欧美精品免费观看二区| 久久福利毛片| 欧美韩国日本综合| 久久黄色影院| 欧美日本一区二区视频在线观看 | 亚洲主播在线| 亚洲人成网站精品片在线观看 | 国内久久精品| avtt综合网| 亚洲盗摄视频| 午夜精品久久久久久久久| 最新日韩精品| 久久成人精品无人区| 中日韩在线视频| 美女尤物久久精品| 欧美在线啊v| 欧美日韩日本国产亚洲在线| 麻豆精品在线视频| 国产精品一区2区| 亚洲人成久久| 亚洲国产岛国毛片在线| 亚洲欧美在线高清| 夜夜嗨一区二区| 免费在线亚洲欧美| 久久久噜噜噜久久| 国产精品永久免费视频| 亚洲毛片在线观看.| 影音先锋一区| 欧美在线视频导航| 午夜欧美电影在线观看| 欧美日韩在线看| 亚洲黄色性网站| 1000部精品久久久久久久久| 欧美一区二视频| 欧美一激情一区二区三区| 欧美日韩另类字幕中文| 亚洲国产综合91精品麻豆| 一区二区亚洲精品国产| 欧美一区二区精品久久911| 亚洲欧美激情精品一区二区| 欧美日本二区| 亚洲欧洲在线一区| 亚洲精品午夜精品| 久热爱精品视频线路一| 久久午夜av| 韩国一区二区三区美女美女秀| 亚洲欧美日韩精品一区二区 | 日韩视频中文字幕| 欧美成人精品1314www| 欧美韩国日本一区| 亚洲第一精品影视| 久久亚洲国产成人| 欧美高清hd18日本| 在线不卡亚洲| 久久在线免费观看|