欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

前言 

今天在項(xiàng)目中需要求采樣點(diǎn)的數(shù)量并且遍歷,采樣點(diǎn)用數(shù)組存儲(chǔ),自定義了一個(gè)函數(shù)想要用sizeof求其長(zhǎng)度,然后遍歷,結(jié)果失敗了,查閱之后發(fā)現(xiàn)以下問(wè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個(gè)數(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個(gè)數(shù)據(jù)\n",len);
}
  

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

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

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

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

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

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

#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是一個(gè)指針,Number2也是一個(gè)指針,正常情況下 大小都應(yīng)該為8
  • 但是實(shí)際的輸出確實(shí) a=40 b=8
  • 也就是說(shuō)數(shù)組名在某些情況下是不等于指針的,只是在一些情況下會(huì)退化為指針

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

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

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

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

我們可以通過(guò)這個(gè)地址訪(fǎng)問(wèn)這個(gè)對(duì)象。用一個(gè)圖來(lái)解釋?zhuān)渲衋代表了整個(gè)我們聲明的內(nèi)存塊,p僅僅指向了一個(gè)char類(lèi)型的對(duì)象

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 中第三段是這樣說(shuō)的:

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.

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

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

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

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

再深入的話(huà),就是要了解指針的sizeof

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

結(jié)論

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

再了解一下Sizeof的處理時(shí)間

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

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

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

解決方法

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

#include <stdio.h>

int Number[10]; 

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

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

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

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

相關(guān)文章

  • C語(yǔ)言實(shí)現(xiàn)學(xué)生成績(jī)等級(jí)劃分的方法實(shí)例

    C語(yǔ)言實(shí)現(xiàn)學(xué)生成績(jī)等級(jí)劃分的方法實(shí)例

    這篇文章主要給大家介紹了關(guān)于C語(yǔ)言實(shí)現(xiàn)學(xué)生成績(jī)等級(jí)劃分的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-12-12
  • C語(yǔ)言結(jié)構(gòu)體,枚舉,聯(lián)合體詳解

    C語(yǔ)言結(jié)構(gòu)體,枚舉,聯(lián)合體詳解

    下面小編就為大家?guī)?lái)一篇全面了解C語(yǔ)言結(jié)構(gòu)體,枚舉,聯(lián)合體。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2021-09-09
  • C++算法學(xué)習(xí)之回溯法的應(yīng)用

    C++算法學(xué)習(xí)之回溯法的應(yīng)用

    這篇文章介紹了C++算法中回溯法的一些應(yīng)用,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-05-05
  • C++圖文并茂分析講解模板

    C++圖文并茂分析講解模板

    C++語(yǔ)言的模板技術(shù)包括函數(shù)模板和類(lèi)模板,模板技術(shù)是一種代碼重用技術(shù),函數(shù)和類(lèi)是C++語(yǔ)言中兩種主要的重用代碼形式,這篇文章主要介紹了C++函數(shù)模板和類(lèi)模板,需要的朋友可以參考下
    2022-09-09
  • C++?實(shí)現(xiàn)讀寫(xiě)鎖的代碼詳解

    C++?實(shí)現(xiàn)讀寫(xiě)鎖的代碼詳解

    C++讀寫(xiě)鎖是一種多線(xiàn)程同步機(jī)制,它允許多個(gè)線(xiàn)程同時(shí)讀取共享數(shù)據(jù),但只允許一個(gè)線(xiàn)程寫(xiě)入共享數(shù)據(jù),這種鎖可以提高程序的并發(fā)性和性能,本文給大家介紹了C++?實(shí)現(xiàn)讀寫(xiě)鎖的代碼,需要的朋友可以參考下
    2023-10-10
  • C++如何刪除map容器中指定值的元素詳解

    C++如何刪除map容器中指定值的元素詳解

    map容器是C++ STL中的重要一員,刪除map容器中value為指定元素的問(wèn)題是我們經(jīng)常與遇到的一個(gè)問(wèn)題,下面這篇文章主要給大家介紹了關(guān)于利用C++如何刪除map容器中指定值的元素的相關(guān)資料,需要的朋友可以參考借鑒,下面來(lái)一起看看吧。
    2017-06-06
  • C++17新特性個(gè)人總結(jié)

    C++17新特性個(gè)人總結(jié)

    這篇文章主要介紹了C++17新特性個(gè)人總結(jié),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-07-07
  • C++?STL?中的數(shù)值算法示例講解

    C++?STL?中的數(shù)值算法示例講解

    本片文章講解了C++STL?中的數(shù)值算法,包含iota、accumulate、adjacent_difference、inner_product、partial_sum這些方法的使用,感興趣的朋友來(lái)看看吧<BR>
    2022-04-04
  • C語(yǔ)言字符串函數(shù)入門(mén)

    C語(yǔ)言字符串函數(shù)入門(mén)

    這篇文章主要為大家介紹了C語(yǔ)言字符串函數(shù),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助
    2022-01-01
  • 關(guān)于VS2022不能使用<bits/stdc++.h>的解決方案(萬(wàn)能頭文件)

    關(guān)于VS2022不能使用<bits/stdc++.h>的解決方案(萬(wàn)能頭文件)

    #include<bits/stdc++.h>包含了目前 C++ 所包含的所有頭文件,又稱(chēng)萬(wàn)能頭文件,那么如何在VS2022中使用萬(wàn)能頭呢?下面小編給大家代理了關(guān)于VS2022不能使用<bits/stdc++.h>的解決方案(萬(wàn)能頭文件),感興趣的朋友一起看看吧
    2022-03-03

最新評(píng)論