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

C語言數(shù)組與地址、數(shù)組名到底是什么詳解

 更新時間:2023年06月06日 15:23:29   作者:Jambo!  
在寫代碼的時候,我們經(jīng)常用到數(shù)組,那么有沒有想過數(shù)組名是什么呢?這篇文章主要給大家介紹了關(guān)于C語言數(shù)組與地址、數(shù)組名到底是什么的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下

1.問題引出

案例:設(shè)計一個函數(shù),可以將整形數(shù)組的次序調(diào)換
例如:arr[5] = {1,2,3,4,5},輸出形式為:arr[5] = {5,4,3,2,1}.

案例代碼:

//能否可以正常排序?
#include <stdio.h>
void reverse(int* arr)
{
	int len = sizeof(arr) / sizeof(arr[0]);
	int top = 0;
	int tail = len - 1;
	while (top < tail)
	{
		int tmp = 0;
		tmp = arr[top];
		arr[top] = arr[tail];
		arr[tail] = tmp;
		top++;
		tail--;
	}
}
int main()
{
	int arr[] = { 1,2,3,4,5 };
	int len = sizeof(arr) / sizeof(arr[0]);
	reverse(arr);
	for (int i = 0; i < len; i++)
	{
		printf("%d ", arr[i]);
	}
	return 0;
}

我們來運(yùn)行一下:

我們發(fā)現(xiàn)結(jié)果并不是和我們想象的一樣輸出 5 4 3 2 1 ,而是對于原數(shù)組來說沒有變化,這是為什么呢?

2.分析錯誤代碼

首先,按F10,點(diǎn)擊調(diào)試——>窗口——>監(jiān)視

在監(jiān)視窗口中輸入arr,這時是運(yùn)行在主函數(shù)中,所以監(jiān)控的是主函數(shù)中的arr

這里能夠看到,arr中儲存著5值

然后按F11進(jìn)入函數(shù)內(nèi)部,這時的監(jiān)視窗口是這樣:

這里有個技巧:需要在監(jiān)視中輸入arr,5才能正常監(jiān)視到:

代碼再往下走,我們發(fā)現(xiàn)len的值為1

但是int len = sizeof(arr) / sizeof(arr[0]),len的值應(yīng)該為arr數(shù)組的長度啊,應(yīng)該是5,為什么是1呢,這就需要了解數(shù)組名到底是什么

3.數(shù)組名是什么?

先探究數(shù)組名與數(shù)組元素首元素地址:

int main()
{
	int arr[10] = { 0 };
	printf("%p\n", arr);    //數(shù)組名
	printf("%p\n", &arr[0]);//數(shù)組首元素地址
	return 0;
}

結(jié)果:

所以得出結(jié)論:數(shù)組名是數(shù)組首元素的地址

但是有兩個例外:

1.sizeof(數(shù)組名),這里的數(shù)組名表示整個數(shù)組,計算的是整個數(shù)組的大小,單位是字節(jié)

2.&數(shù)組名,這里的數(shù)組名表示整個數(shù)組,&數(shù)組名取出的是數(shù)組的地址

驗(yàn)證一下sizeof(數(shù)組名):

int main()
{
	int arr[10] = { 0 };
	printf("%d", sizeof(arr));
	return 0;
}

結(jié)果:

數(shù)組長度為10,int類型一個元素4個字節(jié),所以輸出40,這就說明:

sizeof(數(shù)組名),數(shù)組名表示整個數(shù)組,計算的是整個數(shù)組的大小

驗(yàn)證 &數(shù)組名:

int main()
{
	int arr[10] = { 0 };
	printf("%p\n", arr);    //數(shù)組名
	printf("%p\n", &arr[0]);//數(shù)組首元素地址
	printf("%p\n", &arr);   //數(shù)組名取地址
	return 0;
}

結(jié)果:

發(fā)現(xiàn)這三個輸出的地址都相同,它們有什么區(qū)別呢?我們再來探究一下

arr與·&arr[0]一樣,都是指向數(shù)組首元素地址,他們的類型都是int*
&arr是整個數(shù)組的地址,&arr的類型為:int(*)[10]
由于這個數(shù)組的地址由數(shù)組首元素地址開頭,所以這三個地址值從表面上看起來一樣,但可以從他們的指針類型去區(qū)別他們

再對比一下:

int main()
{
	int arr[10] = { 0 };
	printf("arr:       %p\n", arr);    
	printf("arr+1:     %p\n", arr+1);
	printf("&arr[0]:   %p\n", &arr[0]);
	printf("&arr[0]+1: %p\n", &arr[0]+1);
	printf("&arr:      %p\n", &arr);  
	printf("&arr+1 :   %p\n", &arr+1);
	return 0;
}

結(jié)果:

分析:

arr&arr[0]都跳四個字節(jié),也就是數(shù)組下一個元素地址
&arr跳過了40個字節(jié),它跳過了整個數(shù)組
從這里的計算,也可以體會出arr&arr[0]的類型是int*,而&arr的類型是int(*)[10]

4.錯誤分析與修改

錯誤分析:

前面的內(nèi)容我們知道了數(shù)組名是數(shù)組首元素地址,本質(zhì)上是個指針
所以在函數(shù)中,就需要用int*去接收這個指針變量

void reverse(int* arr)
{
	int len = sizeof(arr) / sizeof(arr[0]);
	int top = 0;
	int tail = len - 1;
	while (top < tail)
	{
		int tmp = 0;
		tmp = arr[top];
		arr[top] = arr[tail];
		arr[tail] = tmp;
		top++;
		tail--;
	}
}

而在reverse內(nèi)部,sizeof(arr)中的arr被判定成了指針,而不是一個數(shù)組,所以sizeof(arr)的值為4,sizeof(arr[0])也為4,所以len的值為1,而top=0tail = len-1 = 0,top = tail,根本進(jìn)不去下面的循環(huán),所以數(shù)組才不會改變

修改:

因?yàn)閿?shù)組作為參數(shù),它的長度不可以在函數(shù)內(nèi)部被計算出來,所以就要在主函數(shù)中把數(shù)組的長度計算出來,將數(shù)組長度作為參數(shù)傳到函數(shù)中

#include <stdio.h>
void reverse(int* arr,int len)
{
	int top = 0;
	int tail = len - 1;
	while (top < tail)
	{
		int tmp = 0;
		tmp = arr[top];
		arr[top] = arr[tail];
		arr[tail] = tmp;
		top++;
		tail--;
	}
}
int main()
{
	int arr[] = { 1,2,3,4,5 };
	int len = sizeof(arr) / sizeof(arr[0]);
	reverse(arr,len);    //兩個參數(shù),一個是數(shù)組首地址,一個是數(shù)組長度
	for (int i = 0; i < len; i++)
	{
		printf("%d ", arr[i]);
	}
	return 0;
}

結(jié)果正確:

因?yàn)槲覀冎罃?shù)組名其實(shí)就是一個指針,所以在函數(shù)的參數(shù)列表中,可以使用int arr[]去接受,也可以用int* arr去接受收

//這兩種形式都可以
void reverse(int* arr,int len);
void reverse(int arr[],int len);

5.總結(jié)

1.一般情況下,數(shù)組名就是數(shù)組首元素的地址

2.有兩個特殊情況:

  • sizeof(數(shù)組名),這里的數(shù)組名表示整個數(shù)組,計算的是整個數(shù)組的大小。
  • &數(shù)組名,這里的數(shù)組名表示整個數(shù)組,&數(shù)組名取出的是數(shù)組的地址。

3.有數(shù)組作為參數(shù)傳入的函數(shù)中,想要計算這個數(shù)組的長度,在函數(shù)內(nèi)部做不到,需要在主函數(shù)中將數(shù)組長度計算出來,將數(shù)組長度作為參數(shù)傳入函數(shù)中,這才可以在函數(shù)中使用

到此這篇關(guān)于C語言數(shù)組與地址、數(shù)組名到底是什么的文章就介紹到這了,更多相關(guān)C語言數(shù)組與地址、數(shù)組名內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 哈夫曼算法構(gòu)造代碼

    哈夫曼算法構(gòu)造代碼

    這篇文章主要介紹了哈夫曼算法構(gòu)造代碼,有需要的朋友可以參考一下
    2013-12-12
  • C++基礎(chǔ)入門教程(五):new和delete

    C++基礎(chǔ)入門教程(五):new和delete

    這篇文章主要介紹了C++基礎(chǔ)入門教程(五):new和delete,本文講解了動態(tài)分配內(nèi)存、new和delete的配對、new、delete與reatin、release的關(guān)系、動態(tài)數(shù)組等內(nèi)容,需要的朋友可以參考下
    2014-11-11
  • 基于C++實(shí)現(xiàn)TCP聊天室功能

    基于C++實(shí)現(xiàn)TCP聊天室功能

    這篇文章主要為大家詳細(xì)介紹了基于C++實(shí)現(xiàn)TCP聊天室功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-07-07
  • libxml教程(圖文詳解)

    libxml教程(圖文詳解)

    本篇文章是對libxm進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-05-05
  • C++實(shí)現(xiàn) vector 的四則運(yùn)算

    C++實(shí)現(xiàn) vector 的四則運(yùn)算

    本文給大家介紹的是在C++中實(shí)現(xiàn)高效的vector四則運(yùn)算的方法的相關(guān)資料,需要的朋友可以參考下
    2016-07-07
  • 簡單講解C++的內(nèi)部和外部函數(shù)以及宏的定義

    簡單講解C++的內(nèi)部和外部函數(shù)以及宏的定義

    這篇文章主要介紹了簡單講解C++的內(nèi)部和外部函數(shù)以及宏的定義,是C++入門學(xué)習(xí)中的基礎(chǔ)知識,需要的朋友可以參考下
    2015-09-09
  • C++使用redis的實(shí)現(xiàn)步驟

    C++使用redis的實(shí)現(xiàn)步驟

    本文主要介紹了C++中的redis-plus-plus庫來操作Redis服務(wù)器,包括連接到Redis服務(wù)器、執(zhí)行各種命令(如get、set、list、set等)、以及處理返回值和錯誤,具有一定的參考價值,感興趣的可以了解一下
    2025-05-05
  • c++ bitset詳解

    c++ bitset詳解

    這篇文章主要介紹了C++ bitset用法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-08-08
  • C語言實(shí)現(xiàn)520表白代碼 祝你表白成功!

    C語言實(shí)現(xiàn)520表白代碼 祝你表白成功!

    這篇文章主要為大家詳細(xì)介紹了C語言實(shí)現(xiàn)520表白代碼,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-05-05
  • C語言數(shù)據(jù)結(jié)構(gòu)與算法之排序總結(jié)(二)

    C語言數(shù)據(jù)結(jié)構(gòu)與算法之排序總結(jié)(二)

    這篇文章住要介紹的是選擇類排序中的簡單、樹形和堆排序,歸并排序、分配類排序的基數(shù)排序,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下
    2021-12-12

最新評論

通榆县| 中西区| 左贡县| 府谷县| 松桃| 濮阳县| 温泉县| 衡阳市| 普兰县| 玛多县| 五河县| 昭平县| 资源县| 竹溪县| 西乌珠穆沁旗| 临武县| 汉源县| 贵州省| 大新县| 鄂尔多斯市| 济源市| 称多县| 乐昌市| 黑河市| 常德市| 东乡县| 白城市| 兴和县| 囊谦县| 永和县| 茂名市| 大竹县| 广德县| 肥东县| 类乌齐县| 池州市| 秀山| 平远县| 上思县| 彩票| 桐庐县|