關於C語言你不知道的事(1)–指標和數組的區別

來源:互聯網
上載者:User
關於C語言你不知道的事(1)–指標和數組的區別 Table of Contents 1 一個很多人都會做錯的面試題 2 數組與指標的差別 2.1 數組和指標是如何訪問的 2.2 數組和指標可以相同麼 1 一個很多人都會做錯的面試題

仔細查看以下代碼,print_arr_addr和print_g_arr_addr的列印輸出地址相同麼。為什麼

#include <stdio.h>int a[10] = {1, 3, 4};void print_arr_addr(int *p){    printf("&p    = 0x%08x.\n", (unsigned)&p);    printf("&p[0] = 0x%08x.\n", (unsigned)&p[0]);}void print_g_arr_addr(){    printf("&a    = 0x%08x.\n", (unsigned)&a);    printf("&a[0] = 0x%08x.\n", (unsigned)&a[0]);}int main(){    print_arr_addr(a);    print_g_arr_addr();    return 0;}

在這裡我先不說答案,相信大家在看完這篇文章後會,自然就清楚為什麼了。 2 數組與指標的差別 2.1 數組和指標是如何訪問的 2.1.1 數組和指標的定義和聲明

在這裡有必要列出聲明和定義的區別: 定義: 只能出現在一個地方,它會為對象分配記憶體 聲明: 可以出現在多個地方,描述對象的類型,用於指代其他地方定義的對象

//x是一個指向int型的指標的聲明extern int *x;//y是一個int型數組的聲明extern int y[];//定義指標xint *x;//定義數組yint y[10];

數組下標的引用: 數組可以直接對資料進行訪問,如果我們定義一個數組int A[ 10 ], A的地址和A[ 0 ]的地址是相同的。


指標下標的引用: 指標對資料的訪問實際上是間接訪問,int * p, p的地址和p[ 0 ]的地址絕對是不同的


總的來說,指標在從記憶體中取資料比數組要多一步,這多出的一步就是取址。數組的地址就是數組第一個元素的地址,因此數組不需要這一個步驟。 2.2 數組和指標可以相同麼

數組和指標當然在有些情況下面是等價的:


在作為函數的形參時,數組聲明與指標聲明是等價的。你可以隨自己喜歡,選擇數組方式或者是指標方式。 在運算式中使用時,下標訪問對於數組和指標也是等價的,c = a[i], 無論a聲明為數組還是指標都沒有區別。 3 小結 對於定義和聲明,數組和指標是不相同的,定義為數組,則聲明也應該是數組,如果混合使用會出現意料不到的錯誤。 當用下標操作符對數組和指標進行運算的時候,數組和指標是等價的。a[ i ]會被編譯器翻譯成*(a+i)的形式。 當數組聲明被用作函數形參的時候,該數組實際會被當作指標來使用。

Author: Elvin, Huang<huangkangying@qq.com>

Date: 2014-12-29 21:55:58

HTML generated by org-mode 6.31a in emacs 23

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.