為什麼兩個陣列不能直接賦值?const詳解

2021-10-02 11:27:33 字數 1839 閱讀 9321

陣列變數 是 const 的指標

在初學陣列時,我們都有這樣的思考:既然變數可以互相賦值,那麼 陣列 可以相互賦值嗎?

比如說:

int a = 1;

int b = 2;

int arr1[3] = ;

int arr2[3] = ;

b = a;//ok

arr2 = arr1;//error

一但這麼些程式就會報錯,為什麼會這樣呢?

int* const arrint arr是否可以劃等號?

我們先來看下面這個程式:

int main() ;

int* const q = arr;

printf("arr = %p\n", arr);

printf("&arr = %p\n", &arr);

printf("q = %p\n", q);

printf("&q = %p\n", &q);

}

這個程式裡,arr 的值與 q 的值相同我們應該是提前都會想到的。問題就是 這個 arr 的位址 與 q 的位址問題。他們會相同嗎?雖然他們都指向 arr,但是這是兩個不同的指標變數,所以他們的位址肯定是不會相同的。請看在我的機器上輸出結果:

arr  = 004ff824

&arr = 004ff824

q = 004ff824

&q = 004ff818

&arr竟然與arrq是一樣的! 為什麼會 這樣?&arrarr有什麼區別?請看下面的程式:

int main() ;

int* const q = arr;

printf("arr = %p\n", arr);

printf("&arr = %p\n", &arr);

printf("arr + 1 = %p\n", arr + 1);

printf("&arr + 1 = %p\n", &arr + 1);

printf("%d\n", ((int)(&arr + 1) - (int)(&arr)));//將指標轉變為int,看位址相差多少

printf("q = %p\n", q);

printf("&q = %p\n", &q);

printf("&q + 1 = %p\n", &q + 1);

}

arr      =   0020f860

&arr = 0020f860

arr + 1 = 0020f864

&arr + 1 = 0020f86c

12q = 0020f860

&q = 0020f854

&q + 1 = 0020f858

&arr + 1arr + 1差了 12 個位元組, 剛好是一整個arr陣列的長度。這意味著什麼?

取陣列的位址 實際上 取走的是 整個陣列的 位址,它將整個陣列視為整體,對它進行加減,大小是整個陣列的大小

&q + 1得值僅僅變化了 4 個位元組 ,就是乙個指標的大小

《關於const 在程式中的使用教學 後續會在本編中加上 ,敬請期待 !>

合併兩個陣列

include using namespace std int sortedinsert int a,int lena,int b,int lenb else printf d n a indexnew printf here lena d,lenb d n indexa,indexb indexn...

兩個陣列之和

題目描述 給定兩個亂序陣列,長度分別為m,n,要求列印出和最大的k個數,和是由兩個陣列中各乙個陣列相加而得。輸入 每行數字短橫符 分割兩個陣列,冒號分割 引數k輸出 輸出為和最大得k個數,和是兩個陣列中各乙個數相加而得。樣例輸入 2,4,1,7,7 3,2,5,6,1,9 6 樣例輸出 16,16,...

交換兩個陣列值使兩個陣列之差最小

有兩個序列a,b,大小都為n,序列元素的值任意整數,無序 要求 通過交換a,b 中的元素,使 序列a 元素的和 與 序列b 元素的和 之間的差最小。例如 var a 100,99,98,1,2,3 var b 1,2,3,4,5,40 假設序列a,b中元素的和為sum a和sum b。假設aa和bb...