最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

數(shù)組名不等于指針?sizeof()函數(shù)求數(shù)組大小錯誤問題及解決

 更新時間:2022年11月14日 15:05:00   作者:Z小旋  
這篇文章主要介紹了數(shù)組名不等于指針?sizeof()函數(shù)求數(shù)組大小錯誤問題及解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教

前言 

今天在項目中需要求采樣點的數(shù)量并且遍歷,采樣點用數(shù)組存儲,自定義了一個函數(shù)想要用sizeof求其長度,然后遍歷,結(jié)果失敗了,查閱之后發(fā)現(xiàn)以下問題:

在main函數(shù)中,sizeof是可以正常工作的

#include <stdio.h>

int Number[10];   

int main()
{
	int size = sizeof(Number);
	printf("數(shù)組大小為:%d\n",size);
	int len = sizeof(Number)/sizeof(int);
	printf("數(shù)組共有%d個數(shù)據(jù)\n",len);

	return 0;
}

輸出:

但是在自定義函數(shù)中就不可以了,如下:

#include <stdio.h>

int Number[10]; 

void print_1(int n[])
{
	int size = sizeof(n);
	printf("數(shù)組大小為:%d\n",size);
	int len = sizeof(n)/sizeof(int);
	printf("數(shù)組共有%d個數(shù)據(jù)\n",len);
}
  

int main()
{
	
	print_1(Number); 
	
	return 0;
}

那么我們首先要知道sizeof函數(shù)的功能:

sizeof是獲取數(shù)據(jù)在內(nèi)存中所占用的存儲空間,以字節(jié)為單位來計數(shù)。

那么這個時候有的同學(xué)就會有問題了,兩次傳入的都是數(shù)組的首地址,為什么主函數(shù)中就可以,自定義函數(shù)中就不行呢?

得益于譚老爺子的C語言書籍普及量和銷量,很多人認(rèn)為數(shù)組名就是指向數(shù)組首地址的一個指針,但其實這個說法是錯誤的!

我們用一個最簡單的例子,假設(shè)數(shù)組名是一個指針,那么:

#include <stdio.h>

int Number[10]; 

int *Number2;
  
int main()
{  
	int a=sizeof(Number);
	int b=sizeof(Number2);
	
	printf("a的大小為:%d \n b的大小為 %d\n",a,b); 
	
	return 0;
}
  • Number是一個指針,Number2也是一個指針,正常情況下 大小都應(yīng)該為8
  • 但是實際的輸出確實 a=40 b=8
  • 也就是說數(shù)組名在某些情況下是不等于指針的,只是在一些情況下會退化為指針

首先我們要知道,單純的數(shù)組名,不是指針

數(shù)組名是一個標(biāo)識符,它標(biāo)識出我們之前申請的一連串內(nèi)存空間,而且這個空間內(nèi)的元素類型是相同的——即數(shù)組名代表的是一個內(nèi)存塊及這個內(nèi)存塊中的元素類型 。

只是在大多數(shù)情況下數(shù)組名會“退化”(C標(biāo)準(zhǔn)使用的decay和converted這兩個詞)為指向第一個元素的指針。

而指針不是一種聚合類的數(shù)據(jù)結(jié)構(gòu),它保存著某一種類型的對象的地址(void*除外),也說它指向這個對象。

我們可以通過這個地址訪問這個對象。用一個圖來解釋,其中a代表了整個我們聲明的內(nèi)存塊,p僅僅指向了一個char類型的對象

char a[] = {'h' 'e' 'l' 'l' 'o'};
char b[] = {'w' 'o' 'r' 'l' 'd'};

char *p=b;

這是怎么一回事呢?

我們看一下C99標(biāo)準(zhǔn):

C99 6.3.2.1 Lvalues, arrays, and function designators 中第三段是這樣說的:

Except when it is the operand of the sizeof operator or the unary & operator, or is a
string literal used to initialize an array, an expression that has type ‘‘array of type’’ is
converted to an expression with type ‘‘pointer to type’’ that points to the initial element of
the array object and is not an lvalue. If the array object has register storage class, the
behavior is undefined.

這段話的意思是: 數(shù)組名只有在

  • sizeof 運算符
  • 取址 & 運算符
  • 字符串常量初始化的數(shù)組 Str[]=“abcdef”

這三種情況下不會發(fā)生退化(array decay)

其余情況下調(diào)用數(shù)組名,都會退化成指向數(shù)組首地址的指針

再深入的話,就是要了解指針的sizeof

  • 指針是用來記錄另一個對象的地址,所以指針的內(nèi)存大小就等于計算機內(nèi)部地址總線的寬度。
  • 對一個地址來取大小呢,如果是32位系統(tǒng)的話即為4,如果是64位系統(tǒng)的話為8,所以呢,在函數(shù)中sizeof獲取的是指針的長度而不是數(shù)組的長度
  • 指針變量的sizeof值與指針?biāo)傅膶ο鬀]有任何關(guān)系。

結(jié)論

也就是說在c語言中,數(shù)組名在函數(shù)的調(diào)用中退化成了一個指針,對函數(shù)的參數(shù)使用Sizeof,sizeof獲取的結(jié)果就是指針的大小,而不是數(shù)組本身的大小

再了解一下Sizeof的處理時間

sizeof是C語言的一種單目操作符(但有人也不這么以為,認(rèn)為它是一種特殊的宏),如C語言的其他操作符++、–等一樣。它并不是函數(shù)

sizeof操作符以字節(jié)形式給出了其操作數(shù)的存儲大小。操作數(shù)可以是一個表達(dá)式或括在括號內(nèi)的類型名。操作數(shù)的存儲大小由操作數(shù)的類型決定,簡單的說其作用就是返回一個對象或者類型所占的內(nèi)存字節(jié)數(shù)。

也就是說,Sizeof是一個C語言的操作符,那么他的處理階段在編譯階段,也就是說你程序沒有運行前,sizeof(arr)就被替換成了一個固定的常量,那么對于動態(tài)生成的數(shù)組大小是不能用sizeof來算出來的。

解決方法

在函數(shù)中多加一個參數(shù),表示數(shù)組的長度

#include <stdio.h>

int Number[10]; 

void print_1(int n[], int len)
{

	printf("數(shù)組大小為:%d\n",len);
	
	printf("數(shù)組共有%d個數(shù)據(jù)\n",len/sizeof(int));

}
  
int main()
{
	
	print_1(Number,sizeof(Number)); 
	
	return 0;
}

以上就是問題的總結(jié)。僅為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • C語言字符串處理的驚天大坑問題解決

    C語言字符串處理的驚天大坑問題解決

    這篇文章主要為大家介紹了C語言字符串處理的驚天大坑問題解決,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-05-05
  • C++多線程強制終止詳細(xì)

    C++多線程強制終止詳細(xì)

    這篇文章主要介紹了C++多線程強制終止, 實際上,沒有任何語言或操作系統(tǒng)可以為你提供異步突然終止線程的便利,且不會警告你不要使用它們。但是下面我們再來簡單看看相關(guān)內(nèi)容吧
    2021-09-09
  • C++實現(xiàn)LeetCode(124.求二叉樹的最大路徑和)

    C++實現(xiàn)LeetCode(124.求二叉樹的最大路徑和)

    這篇文章主要介紹了C++實現(xiàn)LeetCode(124.求二叉樹的最大路徑和),本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-07-07
  • Qt一個進(jìn)程運行另一個進(jìn)程的實現(xiàn)方法

    Qt一個進(jìn)程運行另一個進(jìn)程的實現(xiàn)方法

    本文主要介紹了Qt一個進(jìn)程運行另一個進(jìn)程的實現(xiàn)方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-04-04
  • C++?超詳細(xì)講解stack與queue的使用

    C++?超詳細(xì)講解stack與queue的使用

    C++?Stack(堆棧)?是一個容器類的改編,為程序員提供了堆棧的全部功能,也就是說實現(xiàn)了一個先進(jìn)后出(FILO)的數(shù)據(jù)結(jié)構(gòu),許多程序都使用了?queue?容器。queue?容器可以用來表示超市的結(jié)賬隊列或服務(wù)器上等待執(zhí)行的數(shù)據(jù)庫事務(wù)隊列
    2022-03-03
  • C語言中typedef的用法以及#define區(qū)別詳解

    C語言中typedef的用法以及#define區(qū)別詳解

    這篇文章主要給大家介紹了關(guān)于C語言中typedef用法以及#define區(qū)別的相關(guān)資料,typedef 是用來定義一種類型的新別名的,它不同于宏(#define),不是簡單的字符串替換。而#define只是簡單的字符串替換(原地擴展),需要的朋友可以參考下
    2021-07-07
  • VC++中HTControl控件類之CHTRichEdit富文本編輯控件實例

    VC++中HTControl控件類之CHTRichEdit富文本編輯控件實例

    這篇文章主要介紹了VC++中HTControl控件類之CHTRichEdit富文本編輯控件,是一個比較實用的功能,需要的朋友可以參考下
    2014-08-08
  • OpenCV實現(xiàn)圖像腐蝕

    OpenCV實現(xiàn)圖像腐蝕

    這篇文章主要為大家詳細(xì)介紹了OpenCV實現(xiàn)圖像腐蝕,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-06-06
  • VS中的scanf_s函數(shù)和scanf用法及說明

    VS中的scanf_s函數(shù)和scanf用法及說明

    這篇文章主要介紹了VS中的scanf_s函數(shù)和scanf用法及說明,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-11-11
  • C語言實現(xiàn)哈夫曼樹的方法

    C語言實現(xiàn)哈夫曼樹的方法

    這篇文章主要為大家詳細(xì)介紹了C語言實現(xiàn)哈夫曼樹的方法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-05-05

最新評論

新巴尔虎右旗| 历史| 龙里县| 乌拉特前旗| 平罗县| 红安县| 靖宇县| 日喀则市| 萍乡市| 德兴市| 广元市| 天峻县| 永丰县| 修文县| 西平县| 来宾市| 盐源县| 皮山县| 遂昌县| 襄垣县| 南阳市| 高唐县| 绥棱县| 清原| 唐山市| 勐海县| 霞浦县| 宜川县| 清新县| 昭苏县| 寿光市| 岳阳市| 比如县| 淮阳县| 德昌县| 上虞市| 定安县| 邛崃市| 肃南| 驻马店市| 革吉县|