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

隨筆-145  評論-173  文章-70  trackbacks-0
近來在寫程序的時候遇到了一個問題,就是傳遞一個數組指針進入一個函數的時候,雖然指針能夠順利的傳遞,但是,我們無法求出該數組的大小。見下面的代碼:
#include <stdio.h>
void setNum(int *p,int a);
void setNum(int *p);

int main()
{
    
int a[] = {1,2,4,5};
    printf(
"%d\n",sizeof(a)/sizeof(a[0]));
    setNum(a);
}


void setNum(int *p,int a)
{
    
*= a;
}


void setNum(int *p)
{

    
int Num = sizeof(p)/sizeof(p[0]);
    printf(
"%d\n",Num);
}
結果是,輸出分別是4和1.

原因分析:
1.對于第一個輸出,由于在main函數中定義的為數組,所以可以直接利用sizeof函數來求出a數組的長度。
2.對于傳遞參數類型,比如上面的setNum函數(未傳遞個數版本),此時,調用該函數的時候,a退化為一個普通的指針,也就是說,此時sizeof(p)求出來的就是一個指針的大小,除以int的大小,恰好為1.

啟示:
C語言中,不能夠根據一個數組指針就求出來任意一個數組的大小。解決辦法就是傳第一個參數進來,指定大小。

ps:參考資料(詳實):http://topic.csdn.net/t/20060205/18/4540750.html

摘錄:
>   如果作為函數的參數是沒法求的, 
>   但這樣是可以的: 
>   
>   #define   LENGTH(s)   (sizeof(s)   /   sizeof(int)) 
>   
>   int   s[12]; 
>   int   length   =   LENGTH(s); 
================================================== 
這樣的方法只能用于數組變量的數組名,對于指向數組的指針,以及作為參數的數組名都是沒有效果的,上面已經有人解釋了 
》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》
不可能有辦法的。 
當你定義一個數組的時候: 
int   a[]   =   {1,   2,   3};     //   實際上被編譯為   int   a[3]   =   {1,2,3} 

數組名代表的是數組的地址。注意   ——   你絕對沒有辦法通過數組名動態獲得數組的大小。當你丟失a的長度信息的時候,你永遠不可能知道他的長度。 

那么   sizeof   是怎么回事呢?他不是通過   a   的名字獲得   a的大小了么?   ——   大錯特錯! 

關鍵字   sizeof   產生的是一個編譯期常量(注1)   他的運作方式是這樣的: 

當你寫: 
sizeof   a   
實質是: 
sizeof   (   a的類型   ) 

而a的類型是什么呢?編譯器察看   a的定義發現,   是   int   [3] 
就是說,這里   sizeof   a   實質是: 
sizeof   (   int[3]   ) 
完全等同于常量   12   (假定int為4字節)。 


考慮一個函數 
void   func(   int   a[]   );     
//   寫成   int   a[3]   也不會有本質區別——也許你該試試寫成   int   (&a)   [3]   ? 

C++規定,數組作為形參的時候,a代表數組首地址。 
他的底層意義是:   a   退化為了一個4字節的指針,沒有任何變量表示數組的大小會“自動”被傳遞進來。 

我們看看這個時候   sizeof   a是什么: 
sizeof(   函數形參的a[]   )     =   sizeof(   int*   const   )   =   4     //   當然a[]不是合法的C++類型 


仍然不服氣?好——我們反問一個問題:若你是C   /C++的設計者,   你怎么在兼容原有設計的基礎上讓void   func(   int   a[]   )同時傳遞地址和大小? 

首先,a是一個變量,而且類似數組。他必須是一個地址,否則你不知道如何索引元素。 
他怎么再帶上一個變量表示他的大小呢? 

擴充   sizeof   (a)   的能力? 

sizeof   a   必須產生代碼——不管是常量還是什么。   要讓他在運行時決定   a的值,   a就必須帶上他的大小信息。   

1   你必須修改C標準,讓C支持“兩種”數組。一種是定義處的數組,他分配大片連續內存,和原來的C標準相同。 

2   另一種是作為參數傳遞數組。   你必須傳遞地址和數組大小;這個數組實際上是一個8字節的結構{   地址;   大小}(事實上可能更加復雜,考慮多緯數組如何實現?   )   

3   系統必須根據兩種不同數組分別實現其   []、*   、&等。   原有的數組根據其首地址偏移(這是個常量)和下標尋址;   而參數數組則首先取“地址”內容(這是個變量),然后根據這個地址尋址.... 

厄...   再考慮多維數組——聽起來這不是一整套vector模型么? 

----------------------------------------------- 
注1:   對于C99支持的   flexible   array   ,其   sizeof   運算是運行時求值


posted on 2011-03-01 17:14 deercoder 閱讀(11751) 評論(0)  編輯 收藏 引用 所屬分類: C++
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            欧美三级电影网| 久久亚洲精选| 国产一区二区三区四区在线观看| 欧美日韩国产经典色站一区二区三区 | 欧美视频精品在线观看| 欧美激情精品久久久久久蜜臀| 久热国产精品| 欧美成人精品不卡视频在线观看 | 亚洲精品视频免费在线观看| 亚洲人成啪啪网站| 99视频+国产日韩欧美| 亚洲一区二区在| 性感少妇一区| 久久综合999| 亚洲国产一区在线| 欧美刺激性大交免费视频| 欧美激情一区二区三区蜜桃视频| 亚洲狠狠婷婷| 亚洲一区网站| 久久久久久久综合日本| 欧美精品久久久久久| 国产精品欧美日韩一区二区| 一区国产精品| 亚洲一区二区不卡免费| 久久婷婷一区| 日韩视频一区二区三区在线播放免费观看 | 国产精品毛片| 在线播放日韩欧美| 一区二区三区你懂的| 欧美一区二区三区婷婷月色| 欧美成人性生活| 亚洲婷婷免费| 免费成人性网站| 国产精品视频网址| 亚洲伦理在线免费看| 久久精品成人| 亚洲视频香蕉人妖| 久久亚洲图片| 欧美日韩中文字幕日韩欧美| 国产一区二区三区久久| 一本色道久久88综合亚洲精品ⅰ| 久久露脸国产精品| 夜夜嗨av一区二区三区四季av| 欧美一区亚洲一区| 欧美日韩精品免费观看视一区二区 | 国产精品进线69影院| 亚洲成人在线网| 欧美一区二区视频免费观看| 亚洲美女中文字幕| 麻豆freexxxx性91精品| 国产一区二区日韩精品| 亚洲欧美日韩爽爽影院| 亚洲欧洲精品一区二区| 久久久青草婷婷精品综合日韩| 国产精品一区在线观看| 亚洲视频二区| 亚洲精品久久久一区二区三区| 美女国内精品自产拍在线播放| 一区二区三区在线看| 久久婷婷国产麻豆91天堂| 性欧美暴力猛交69hd| 国产女优一区| 久久精品中文字幕免费mv| 欧美亚洲视频在线看网址| 国产精品嫩草久久久久| 香蕉成人久久| 欧美一区二区三区免费大片| 国产一区二区三区免费在线观看| 久久国产欧美日韩精品| 欧美专区在线观看| 国产精品三级视频| 亚洲综合精品自拍| 亚洲午夜激情网站| 国产精品久久77777| 午夜一级久久| 午夜精品一区二区三区在线播放| 国产精品午夜av在线| 亚洲欧美日韩精品久久| 夜夜精品视频| 国产日韩欧美一区二区| 久久riav二区三区| 久久精品国产成人| 激情欧美日韩| 久久国产精彩视频| 亚洲第一区在线观看| 蜜桃久久av一区| 欧美激情精品久久久久| aa亚洲婷婷| 亚洲素人一区二区| 国产伦精品一区二区三区视频黑人| 欧美一级午夜免费电影| 久久激情视频| 美国成人直播| 亚洲日本在线视频观看| 一区二区三区高清视频在线观看| 国产精品www网站| 久久久久在线| 欧美ed2k| 欧美与欧洲交xxxx免费观看 | 亚洲一区二区三区四区中文| 国产亚洲欧美日韩精品| 亚洲福利视频网| 国产精品播放| 久久精品一二三| 欧美xart系列在线观看| 亚洲一区二区欧美日韩| 性欧美在线看片a免费观看| 亚洲三级免费电影| 亚洲欧美日本国产专区一区| 尤妮丝一区二区裸体视频| 亚洲日本在线视频观看| 国产日韩欧美一区二区| 亚洲二区视频| 国产偷国产偷精品高清尤物| 亚洲国产一区在线| 国产综合18久久久久久| 中文亚洲视频在线| 亚洲激情国产精品| 亚洲综合精品四区| 亚洲精选国产| 久久激情五月丁香伊人| 亚洲一二三四区| 欧美jizzhd精品欧美巨大免费| 欧美一区2区三区4区公司二百| 欧美aa国产视频| 国内精品久久久久伊人av| 妖精成人www高清在线观看| 亚洲国产精品www| 亚洲欧美日韩人成在线播放| 日韩一级二级三级| 久久久亚洲午夜电影| 欧美在线精品免播放器视频| 欧美三日本三级少妇三2023| 亚洲精品一品区二品区三品区| 一区二区三区在线免费播放| 午夜欧美电影在线观看| 亚洲主播在线观看| 欧美日韩国产丝袜另类| 亚洲福利在线观看| 亚洲高清影视| 久久久久网址| 美女黄色成人网| 国产亚洲欧美日韩精品| 午夜精品一区二区三区电影天堂| 午夜欧美大尺度福利影院在线看| 欧美成人免费在线| 欧美va日韩va| 亚洲高清av| 老司机精品福利视频| 亚洲国产精品123| 亚洲国产精品一区在线观看不卡| 欧美在线视频观看| 久久久久国内| 黑人巨大精品欧美一区二区| 久久精品国产精品亚洲| 久久久久久久久久久一区| 国产欧美日韩亚州综合| 欧美一级夜夜爽| 国产一区日韩欧美| 久久xxxx| 久久先锋资源| 在线精品一区| 欧美精选午夜久久久乱码6080| 亚洲经典在线看| 一本一本a久久| 欧美午夜在线视频| 亚洲欧美综合精品久久成人| 久久精品久久99精品久久| 一区二区三区在线高清| 欧美精品日韩综合在线| 99国产麻豆精品| 欧美一区二区三区四区在线观看地址| 国产欧美亚洲日本| 久久影院午夜论| 亚洲日本电影| 亚洲欧美日韩专区| 精品成人国产| 欧美日韩国产丝袜另类| 亚洲欧美日韩国产中文| 老司机精品视频一区二区三区| 亚洲国产日韩欧美| 欧美视频在线观看 亚洲欧| 亚洲欧美中文另类| 欧美 日韩 国产在线| 亚洲欧美中文日韩在线| 韩国三级电影久久久久久| 欧美电影免费观看高清| 亚洲小说区图片区| 麻豆久久婷婷| 亚洲视频观看| 亚洲福利一区| 国内外成人免费激情在线视频| 欧美成人免费小视频| 性欧美暴力猛交69hd| 日韩视频欧美视频| 欧美α欧美αv大片| 午夜免费电影一区在线观看| 91久久久久| 1769国产精品| 国产日韩视频一区二区三区|