關於int a[]和int *a的區別

源於對memset函數的使用,memset函數可以非常方便的對數組進行初始化

memset()函數原型是extern void *memset(void *buffer, int c, int count)

buffer:爲指針或是數組

c:給buffer賦值的值

count:是buffer的長度

舉個栗子1:

//c:
#include<stdio.h>
#include<string.h>
int main()
{
    int arr[100];
    memset(arr,0,sizeof(arr));
    for(int i=0;i<10;i++){
		printf("%d:%d ",i,arr[i]);
	} 
}

//c++:
#include<iostream>
// #include<string> 這個是不行的哈
#include<cstring> //或者#include<string.h>
using namespace std;
int main()
{
    int arr[100];
    memset(arr,0,sizeof(arr));
    for(int i=0;i<10;i++){
		cout<<i<<":"<<arr[i]<<" ";
	} 
	cout<<endl;
}

輸出:

0:0 1:0 2:0 3:0 4:0 5:0 6:0 7:0 8:0 9:0

這樣的初始化是可以的,但是反觀下邊的栗子2:

//c:
#include<stdio.h>
#include<string.h>
int main()
{
	int *arr=new int[10];
    memset(arr,0,sizeof(arr));
    for(int i=0;i<10;i++){
		printf("%d:%d ",i,arr[i]);
	} 
}

//c++:
#include<iostream>
// #include<string> 這個是不行的哈
#include<cstring> //或者#include<string.h>
using namespace std;
int main()
{
    int *arr=new int[10];
    memset(arr,0,sizeof(arr));
    for(int i=0;i<10;i++){
		printf("%d:%d ",i,arr[i]);
	} 
}

輸出:

0:0 1:0 2:10813776 3:0 4:1281122676 5:1818321775 6:1196379136 7:1163087439 8:1380275794 9:1146903613
    
//如果是將後邊的代碼覆蓋之前的代碼,運行結果可能會是
0:0 1:0 2:0 3:0 4:0 5:0 6:0 7:0 8:0 9:0
//因爲程序運行時數組arr分配的棧可能與上一段代碼相同,這裏的數據其實是上一段代碼已經寫好的,不信你可以改成以下代碼試試
memset(arr,-1,sizeof(arr));
0:-1 1:-1 2:0 3:0 4:0 5:0 6:0 7:0 8:0 9:0

當然這個輸出只是我的電腦,每個人的電腦上這個結果肯定是不同的,因爲除了第一個arr[0]和arr[1]爲0可以確定以外,其他值都是隨機的,也可以說是該段內存上次寫入的值

C\C++中頭文件string與string.h的區別

https://blog.csdn.net/smf0504/article/details/52227542

所以同樣是大小爲10的數組,爲什麼會出現不同的結果呢?

答案是,int a[]和int *a雖然確實表示的是同一個大小爲10的數組,但是數組名錶示的是一個數組的元素首地址,而指針指向的數組首元素的地址,在這一個層面上兩者是沒有區別的,但是通過sizeof的結果是完全不同的,來我們看一下栗子3:

#include<iostream>
using namespace std;

int main()
{
	int *arr=new int[10];
	cout<<"1:"<<sizeof(arr)<<endl;
    int arr[10];
	cout<<"2:"<<sizeof(arr)<<endl;
}

輸出:

1:8
2:40

顯然,指針arr表示的爲一個指針大小 4字節(32-bit)和8字節(64-bit) ,指針大小是跟系統位數有關係,跟指針類型沒關係的

而數組arr表示的是該數組的大小4*10,int類型爲4字節

所以這個可以推出栗子2中爲什麼arr[0]和arr[1]被初始化爲-1了,因爲arr是int類型的數組,所以8字節/4字節=2個

爲了對指針指向的數組初始化,栗子4:

//c:
#include<stdio.h>
#include<string.h>
int main()
{
	int *arr=new int[10];
    memset(arr,0,sizeof(arr)*10);
    for(int i=0;i<10;i++){
		printf("%d:%d ",i,arr[i]);
	} 
}

//c++:
#include<iostream>
// #include<string> 這個是不行的哈
#include<cstring> //或者#include<string.h>
using namespace std;
int main()
{
    int *arr=new int[10];
    memset(arr,0,sizeof(arr)*10);
    for(int i=0;i<10;i++){
		printf("%d:%d ",i,arr[i]);
	} 
}

輸出:

0:0 1:0 2:0 3:0 4:0 5:0 6:0 7:0 8:0 9:0

在對指針指向的數組進行初始化時,sizeof(arr)還需要乘以數組長度才能對完整的數組初始化

到這來,odekk了

這裏是別人總結的:

指針佔用內存空間存儲地址;數組名是一個數組起始的位置。指針的指向可以修改,數組在內存中起始位置無法修改。
對指針使用sizeof得到的是4字節(32-bit)和8字節(64-bit),而對數組名使用sizeof得到的是數組的大小。
做爲形參的時,int a[]與int *a沒有實際作用上的區別。當然,如果你採用a[]作爲形參,可以更明顯的體現這是一個數組。
————————————————
版權聲明:本文爲CSDN博主「寫程序的胖子」的原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/qq_33666633/article/details/80455662

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章