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

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

FeedBack:
# re: 從一道面試題看指針與數組的區別
2008-09-15 11:06 | 路過
一個字,強!  回復  更多評論
  
<2009年2月>
25262728293031
1234567
891011121314
15161718192021
22232425262728
1234567

常用鏈接

留言簿(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>
            亚洲精品视频在线播放| 亚洲精品久久久久久下一站| 欧美极品一区| 久久天堂av综合合色| 欧美日韩精品久久久| 欧美国产日韩xxxxx| 国产欧美日韩在线观看| 亚洲作爱视频| 99热这里只有精品8| 久久久亚洲国产天美传媒修理工| 亚洲欧美中文日韩v在线观看| 欧美激情第3页| 理论片一区二区在线| 国产欧美日韩一区二区三区在线| 亚洲精品综合精品自拍| 亚洲欧洲精品一区二区| 欧美a一区二区| 免费观看一级特黄欧美大片| 国产性猛交xxxx免费看久久| 亚洲一区二区三区精品动漫| 亚洲网站在线| 欧美视频中文字幕| 日韩天天综合| 亚洲网站啪啪| 国产精品高潮久久| 一区二区三区欧美日韩| 亚洲男女毛片无遮挡| 国产精品成人一区二区艾草| 亚洲视频网在线直播| 亚洲欧美日本视频在线观看| 国产精品美女www爽爽爽视频| 夜夜嗨一区二区| 亚洲欧美综合v| 国产精品一区二区三区成人| 午夜精品久久久99热福利| 欧美永久精品| 伊人影院久久| 欧美成人免费全部观看天天性色| 亚洲激情视频在线| 亚洲深夜激情| 国产欧美一区二区精品性色| 欧美伊人久久| 欧美激情一区二区三区在线视频观看 | 国产精品99久久久久久久女警 | 国产精品一二三| 亚欧美中日韩视频| 免费视频最近日韩| 亚洲美女在线看| 国产精品v欧美精品v日本精品动漫| 亚洲一区精品视频| 裸体女人亚洲精品一区| 日韩视频免费大全中文字幕| 欧美日韩一区二区在线| 先锋影音久久| 亚洲福利国产| 欧美亚洲日本国产| 禁久久精品乱码| 欧美精品综合| 午夜在线视频观看日韩17c| 欧美成人精品高清在线播放| 中国日韩欧美久久久久久久久| 国产日韩欧美中文| 欧美岛国激情| 欧美一级淫片aaaaaaa视频| 亚洲高清av| 欧美中文字幕视频| 亚洲精品一区二区在线观看| 国产精品一香蕉国产线看观看| 久久综合国产精品台湾中文娱乐网| 一本高清dvd不卡在线观看| 久久中文字幕导航| 亚洲嫩草精品久久| 亚洲日韩成人| 黑人巨大精品欧美一区二区| 欧美日韩中文字幕| 另类激情亚洲| 羞羞漫画18久久大片| 亚洲人永久免费| 欧美成人中文字幕| 久久久久www| 亚洲欧美综合一区| 亚洲视频图片小说| 免费中文日韩| 欧美va天堂| 欧美在线黄色| 亚洲激情偷拍| 激情国产一区| 亚洲欧洲综合| 亚洲视频每日更新| 亚洲欧美自拍偷拍| 久久久久成人精品| 欧美激情视频在线免费观看 欧美视频免费一 | 久久综合999| 亚洲国产精品成人一区二区| 亚洲精品少妇网址| 亚洲调教视频在线观看| 久久成人人人人精品欧| 老司机精品视频一区二区三区| 蜜臀久久99精品久久久久久9| 欧美日韩国产页| 国产欧美亚洲精品| 亚洲人精品午夜| 午夜精品福利在线| 久久香蕉精品| 亚洲精品久久久蜜桃| 亚洲欧美视频在线观看视频| 久久综合九色综合久99| 欧美三级欧美一级| 精品91免费| 一区二区三区欧美激情| 久久久久久综合| 日韩一级在线| 久久嫩草精品久久久久| 欧美亚州在线观看| 亚洲第一精品久久忘忧草社区| 亚洲视频第一页| 男同欧美伦乱| 亚洲一区二区在线免费观看视频 | 国产麻豆9l精品三级站| 91久久久久久| 久久国产精品毛片| 亚洲人成网站在线观看播放| 欧美一区二区在线观看| 欧美日韩大陆在线| 在线观看视频一区| 午夜精品国产| 91久久久在线| 久久久久免费视频| 国产精品亚洲片夜色在线| 亚洲精品在线免费| 美女被久久久| 亚洲欧美在线免费| 欧美午夜不卡视频| 亚洲黄色视屏| 另类综合日韩欧美亚洲| 亚洲自拍电影| 国产精品进线69影院| 亚洲美女在线视频| 欧美成人免费观看| 久久精品国产精品| 国产香蕉久久精品综合网| 亚洲欧美一区二区激情| 亚洲精品视频免费| 欧美电影在线观看完整版| 在线成人国产| 久久综合久色欧美综合狠狠 | 美腿丝袜亚洲色图| 激情五月婷婷综合| 久久国产视频网站| 亚洲综合精品自拍| 国产精品美女xx| 亚洲欧美中文日韩在线| 宅男噜噜噜66一区二区66| 欧美日韩精品一本二本三本| 亚洲免费电影在线| 亚洲黄网站在线观看| 欧美成人亚洲成人| 亚洲精品日韩激情在线电影| 欧美护士18xxxxhd| 欧美成人中文字幕| 亚洲另类在线视频| 亚洲日本成人网| 欧美日韩国产一区二区三区| 在线亚洲+欧美+日本专区| 99视频精品免费观看| 欧美午夜视频在线| 亚洲欧美欧美一区二区三区| 亚洲午夜精品国产| 国产日本欧美一区二区三区在线| 欧美一区二区三区四区在线| 性欧美暴力猛交69hd| 国产专区欧美精品| 欧美成人高清| 欧美精品在线视频| 亚洲一区二区三区四区五区午夜| 亚洲性图久久| 国产亚洲亚洲| 欧美夫妇交换俱乐部在线观看| 欧美黄色免费网站| 亚洲一区国产视频| 欧美亚洲尤物久久| 在线观看成人一级片| 亚洲日本va午夜在线电影| 欧美视频日韩视频在线观看| 欧美一区国产二区| 久久久91精品国产| 亚洲卡通欧美制服中文| 亚洲午夜激情网页| 国一区二区在线观看| 亚洲国产网站| 国产精品影视天天线| 欧美a级一区| 欧美日韩一二三区| 久久久之久亚州精品露出| 免费日韩精品中文字幕视频在线| 亚洲无线视频| 久久久噜噜噜久久| 亚洲婷婷在线| 久久精品女人天堂| 亚洲午夜av电影|