程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> C語言中的指針與數組的關聯1

C語言中的指針與數組的關聯1

編輯:關於C語言

C語言中的指針與數組的關聯1


 在C語言中,指針是一種類型,存放的是地址,例如char*p,這裡p存放的是字符型數據的地址,int*p,p存放的是整形數據的地址,我們可以通過解運用*來獲取該地址所指向的內容。而數組則是一種數據類型的集合,如int arr[]={1,2,3,4,5,6,7,8,9,10};這裡聲明與定義了一個整形數組,而char arr[]="hello world";則是聲明與定義了一個字符類型的數組,這個數組內存放的是一個字符串。     C語言規定,在大多數情況下數組名其實質就是數組元素的首地址,所以我們可以通過運用指針的方式來訪問數組,或者用數組下標的方式來訪問指針所指向的內容,注意,這裡時所指向的內容,並不是指針本身。舉個例子:  
int main()
{
int i = 0;
int arr[10] = { 0 };//數組的初始化
int*p = arr;//創建一個指向arr的指針
for (i = 0; i < 10; i++)//利用指針的原理對數組進行賦值
{
*(arr + i) = i;
}
for (i = 0; i < 10; i++)//利用數組下標的方式對指針所指向空間進行賦值
{
p[i] = i;
}
for (i = 0; i < 10; i++)//對結果進行驗證
{
printf("arr[%d]=%d *(p+%d)=%d\n", i, arr[i], i, *(p + i));
}
system("pause");
return 0;
}

 

      這份代碼要注意兩點,第一是多個指針可以指向同一塊目標,第二是當數組利用指針原理進行訪問時,其本身發生了降級(C和指針這本書中有講過,解釋什麼是降級並不是很明確),這裡我們首先要明確,指針是指針,並不是數組,創建數組,內存開辟了多個字節(取決於創建大小與所創建的數據類型),而所有指針都只有4個字節,占用一塊內存空間。而所謂數組降級,就是數組名從占用多個地址,變為數組首元素的地址。只有兩種運算時數組不會降級,一個事對數組進行取地址時,如&arr,還有就是調用sizeof函數時數組不會降級。再給個例子:  
int main()
{
int i = 0;
int arr[10] = { 0 };//數組的初始化
int*p = arr;//創建一個指向arr的指針
printf("%d ",sizeof(arr));
printf("%d ", sizeof(p));
printf("%d ", sizeof(arr[0]));
printf("%d ", sizeof(&arr));
printf("%d ", sizeof(&arr[0]));
printf("%d ", sizeof(*&arr));
system("pause");
return 0;
}

 

      這份代碼的輸出結果是什麼呢,我們一個一個進行分析,首先int 類型占四個字節     第一個輸出,上文提到過sizeof函數不會使數組降級,所以求的是整個數組的字節,是40     第二個輸出,指針占四個字節,其輸出結果為4     第三個輸出,是求arr[0]的大小,為四個字節,也可以說是對arr進行了下標運算,使arr發生了降級還是4     第四個輸出,取arr的地址,地址,肯定為四個字節     第五個,也是地址,四個字節     最後一個呢,取arr的地址,然後進行解運用,所得還是arr整個數組,在求其所占字節,為40     未完待續

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved