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

posts - 297,  comments - 15,  trackbacks - 0

從一道面試題看指針與數組的區別

 

 

題記:

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

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

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

p2 = *pp;
p1p2是否相同

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

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

    這個題目存在的兩個問題,第一個問題比較簡單,可以認為是粗心大意。但是第二個問題就是相當復雜了,擴展開來,那就是C語言中的精華中的指針和數組的聯系與區別問題了。

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

1 指針和數組的區別

1)指針和數組的分配

    數組是開辟一塊連續的內存空間,數組本身的標識符(也就是通常所說的數組名)代表整個數組,可以使用sizeof來獲得數組所占據內存空間的大小(注意,不是數組元素的個數,而是數組占據內存空間的大小,這是以字節為單位的)。舉例如下:

#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;
}

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

 2)空間的分配

    這里又分為兩種情況。

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

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

3)使用方法

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

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;
}

 執行結果如下:

 // 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

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

 [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 閱讀(874) 評論(1)  編輯 收藏 引用 所屬分類: C++_BASIS

FeedBack:
# re: 從一道面試題看指針與數組的區別
2008-09-15 11:06 | 路過
一個字,強!  回復  更多評論
  
<2010年4月>
28293031123
45678910
11121314151617
18192021222324
2526272829301
2345678

常用鏈接

留言簿(10)

隨筆分類(307)

隨筆檔案(297)

algorithm

Books_Free_Online

C++

database

Linux

Linux shell

linux socket

misce

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

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>
            亚洲电影在线免费观看| 亚洲三级电影全部在线观看高清| 欧美精品久久久久久久免费观看| 亚洲欧洲精品一区二区三区波多野1战4 | 在线观看日韩欧美| 欧美日韩八区| 欧美日韩黄色大片| 国产精品久久波多野结衣| 欧美日韩综合网| 国产精品视屏| 国内精品伊人久久久久av影院| 国产日韩视频一区二区三区| 国产精品免费aⅴ片在线观看| 国产精品国产精品| 国产综合在线看| 国产精品日日摸夜夜添夜夜av| 亚洲午夜精品17c| 亚洲一区亚洲| 欧美一区二区网站| 欧美国产亚洲视频| 一级成人国产| 久久精品国产99| 一区免费在线| 久久婷婷人人澡人人喊人人爽| 免费成人黄色片| 国产精品一区=区| 亚洲品质自拍| 欧美一区二区三区在| 欧美大片免费观看| 亚洲一区亚洲二区| 欧美激情五月| 黑丝一区二区三区| 亚洲免费人成在线视频观看| 欧美成人乱码一区二区三区| 亚洲自拍偷拍福利| 欧美日韩精品二区| 狠狠噜噜久久| 欧美在线播放高清精品| 亚洲精品少妇30p| 久久视频在线免费观看| 国产精品一区毛片| 99国产精品私拍| 老司机67194精品线观看| 一区二区高清视频| 欧美精品日韩三级| 亚洲欧洲偷拍精品| 麻豆精品精华液| 亚洲影音先锋| 欧美激情1区2区3区| 永久免费精品影视网站| 欧美一区二区三区免费观看视频| 最新亚洲激情| 蜜臀a∨国产成人精品| 极品少妇一区二区三区精品视频| 欧美一区二区三区免费在线看| 亚洲精品小视频| 欧美成人一区二区三区在线观看 | 亚洲国产精品久久久久婷婷884| 欧美激情亚洲自拍| 香蕉久久夜色精品国产| 国产精品婷婷| 亚洲欧美一区二区三区极速播放| 日韩视频精品| 国产精品成人av性教育| 一区二区三区**美女毛片| 亚洲黄色免费电影| 亚洲第一区色| 一区二区三区黄色| 亚洲乱亚洲高清| 欧美日本国产在线| 一区二区三区欧美在线| 99精品黄色片免费大全| 欧美日韩成人综合| 亚洲一级黄色av| 在线视频免费在线观看一区二区| 欧美日韩视频在线一区二区观看视频| 日韩一区二区免费高清| 亚洲精品你懂的| 国产精品xxxxx| 久久成人久久爱| 久久久久九九视频| 亚洲国产裸拍裸体视频在线观看乱了| 欧美激情一区二区在线 | 欧美午夜视频在线| 久久精品视频免费播放| 久久国产视频网| 亚洲激情偷拍| 亚洲系列中文字幕| 国产日韩高清一区二区三区在线| 久久最新视频| 欧美日韩国产精品专区| 欧美一区二区精品| 老鸭窝毛片一区二区三区| 亚洲精品一区在线观看香蕉| 99在线观看免费视频精品观看| 国产精品草草| 老司机精品视频网站| 欧美国产第一页| 日韩天堂av| 亚洲国产乱码最新视频| 欧美性淫爽ww久久久久无| 欧美主播一区二区三区| 毛片基地黄久久久久久天堂| 亚洲欧美视频在线观看| 久久免费视频在线观看| 欧美亚洲日本网站| 欧美激情精品久久久久久黑人 | 激情av一区二区| 日韩视频在线观看| 伊人成人在线| 亚洲欧美一区二区在线观看| 亚洲精品综合| 久久精品国产99国产精品澳门 | 欧美激情一区二区| 国产日韩欧美日韩| 一本色道久久综合亚洲精品高清| 在线精品亚洲| 午夜精品美女久久久久av福利| 日韩亚洲成人av在线| 久久久久久有精品国产| 性做久久久久久| 国产精品a级| 亚洲精品一品区二品区三品区| 一区二区亚洲欧洲国产日韩| 亚洲免费在线| 国内精品模特av私拍在线观看| 亚洲大胆女人| 好吊妞**欧美| 午夜视频精品| 午夜免费在线观看精品视频| 欧美激情第9页| 欧美国产高清| 亚洲观看高清完整版在线观看| 欧美一区在线直播| 欧美一区国产一区| 国产伦精品一区二区三区高清| 一区二区三区日韩在线观看| 国产色综合网| 一区二区日韩精品| 亚洲欧美日韩中文视频| 国产精品播放| 亚洲女人av| 久久久久网站| 尤物网精品视频| 免费的成人av| 亚洲精品久久久久久久久久久久| 亚洲精品久久久蜜桃| 欧美高清在线| 99精品视频免费| 午夜在线一区二区| 国产精品午夜电影| 久久精品成人| 亚洲国产精品久久久久秋霞蜜臀 | 国产欧美日韩在线观看| 欧美一级在线播放| 男女激情久久| 99热这里只有成人精品国产| 欧美日韩在线另类| 亚洲欧美视频一区二区三区| 久久精品人人爽| ●精品国产综合乱码久久久久| 久久五月天婷婷| 最新精品在线| 欧美一区国产在线| 亚洲激情另类| 国产精品一二三四区| 久久久www成人免费无遮挡大片| 欧美国产综合一区二区| 亚洲视频自拍偷拍| 狠狠色丁香久久婷婷综合丁香| 久久天天躁狠狠躁夜夜爽蜜月| 亚洲国产日韩美| 欧美一区二区在线免费播放| 亚洲电影第三页| 欧美视频日韩视频在线观看| 校园春色国产精品| 亚洲精品中文在线| 久久影视精品| 亚洲欧美在线网| 亚洲精品系列| 国一区二区在线观看| 欧美人成在线| 久久久久一区二区三区| 亚洲视频一区二区| 亚洲国产美女久久久久| 亚洲自拍偷拍福利| 亚洲第一黄网| 国产一区二区成人久久免费影院| 欧美大成色www永久网站婷| 亚洲欧美另类中文字幕| 亚洲精品视频在线观看免费| 久久久久久91香蕉国产| 亚洲一区二区四区| 亚洲激情自拍| 亚洲欧美激情四射在线日| 国产精品麻豆成人av电影艾秋| 中文欧美日韩| 美女图片一区二区| 亚洲国产天堂久久综合网| 午夜欧美大尺度福利影院在线看|