<深入理解C指標>學習筆記和總結 第四章 指標和數組,深入理解學習筆記

來源:互聯網
上載者:User

<深入理解C指標>學習筆記和總結 第四章 指標和數組,深入理解學習筆記
數組是一個什麼玩意:
數組和指標我的理解,有相同之處也有不同之處。因有相同之處,因此一些資料上說,數組和指標本質是相同的。因有不同之處,因此也有一些資料上說,數組和指標是不一樣的。
相同之處:
數組名字和指標名字都代表了一個地址。
如:int num[10];num是數組名。函數開闢了一個儲存十個整數類型的空間,而num是他們的首地址。
int *p;
p=(int *)malloc(10*sizeof(int));類似的,p也指向了首地址。
不同之處是,num[10]中的空間位置是在棧中,而 ×p指向的空間是在堆中。
p可以指向別的地址(即p可以進行指標運算。是一個變數)但是num不可以運算,是一個常量。
一維數組與指標數組:
int num[5]={1,2,3,4,5};
引用的時候:printf("%d",num[i]);
int *num2[5]={&n1,&n2,&n3,&n4,&n5};
引用的時候:printf("%d",*num[i]);
二維數組:
int num[i][j];


可以用malloc建立數組:
int *pv=(int *)malloc (5*sizeof(int));
for(i=0;i<5;i++)
p[i]=i+1;//*(p+i)=i+1;
指標的一維數組:
int *arr[5];
int i;
for(i=0;i<5;i++)
{
    arr[i]=(int *)malloc(sizeof(int));
    *arr[i]=i;
}
或者:
*(arr+i)=(int *)malloc(sizeof(int));
**(arr+i)=i;
第二種分析: (arr+i)表示數組第i個元素的地址。我們需要修改這個地址中的內容,因此用了×(arr+i)而 arr+i的內容是一個指標,指向一個記憶體。因此再此解引。返回的是所分配記憶體的位置。
二維數組的傳遞:
以2.c為例子。雖然是二維數組,但是 在函數中,是以一維數組來使用的。因為聲明中就是一維數組。所以在子函數中無法以arr[i][j]的方式來使用數組裡的內容。只能用
arr+位移量 然後解引的方式: *(arr+(i*cols)+j)
也可以動態分配二維數組:
int rows2;
int columns=5;
int **matrix=(int **)malloc(rows*sizeof(int *));//類型是二維數組。裡面的每一個元素是一個整形指標。
for(i=0;i<rows;i++)
{
    matrix[i]=(int *)malloc(colums*sizeof(int));//每一個元素都指向一個整形一維數組。
}

該方式類似於參考 字串指標的表示方式。

程式碼範例:

1//指標數組:
#include <stdio.h>
int main(void)
{
    int* num1[3];
    int num2[3]={1,2,3};
    int i;
    for(i=0;i<3;i++)
num1[i]=&num2[i];
    for(i=0;i<3;i++)
printf("%4d",*num1[i]);
    putchar('\n');
    return 0;
}

2/二維數組的表示:
#include <stdio.h>
void arr_initial(int *arr,int rows,int cols)
{
    int i,j;
    int num=1;
for(i=0;i<rows;i++)
  for(j=0;j<cols;j++)
  {
     *( arr+(i*cols)+j)=num++;
  }
}
void arr_print(int *arr,int rows,int cols)
{
    int i,j;
    int num=1;
for(i=0;i<rows;i++)
{for(j=0;j<cols;j++)
  {
     printf("%4d",*( arr+(i*cols)+j));
  }
  putchar('\n');
}
}


int main(void)
{
    int num1[5][6];
    int num2[7][8];
    arr_initial(&num1[0][0],5,6);
    arr_print(&num1[0][0],5,6);
    arr_initial(&num2[0][0],7,8);
    arr_print(&num2[0][0],7,8);
    return 0;
}



C中指標與數組的問題

你的理解是對的,正常情況下應該在編譯時間提示錯誤的
 
深入理解指標與數組的一道題

在一般上下文中,對數組的引用會退化為指標,例如:
int a[5];
int *p = a + 1;
在這代碼中,第二行對a的引用退化為一個指標,指標類型為int。
在&a這樣的運算式中數組退化為指標的規則則不再使用。作為一個整體,&a也表示一個指標,它與a不同的就是:a的指標類型為int,而&a的指標類型為int[5]。
用這段理解來解釋樓主的問題就不難了

-------------------------------------------------
補充知識:
1)在c語言中,並沒有真正的數群組類型,大部分對數組的引用會退化為指標
2)多位元組的情況:
例如int a[x][y];
則a退化為指標類型是int[y],&a的類型則是int[x][y]
3)數組退化為指標的規則不能遞迴應用。數組的數組退化為數組的指標,而不是指標的指標。
如果你向函數傳遞一個二維數組,例:
int a[x][y];
f(a);
則f必須聲明成
int f(int a[][y]);

int f(int (*a)[y]);
而不能是
int f(int **a);

-----------------------------------
樓主,你所聽說的a稱作常量指標,這都是騙小孩子玩意,要想真正理解數組,必須明白在運算式中出現a,a退化為指標

“數組名“之所以為常量是因為它不能被賦值,但!!數組不是指標!!。數組只是在運算式中出現時退化為指標,而指標&p與數組&a則是截然不同的行為,這正說明數組不是指標。
例如 int *p = (int *) 111;
那麼p是111,而&p則是p的地址(可能為0x00122222),
但對於數組 int a[6];
若a是0x00123333,則&a也是0x00123333,只是這兩者的指標類型不同

-----------------------------------------------

另外,在參數傳遞時數組也經常令人困惑
例如int f(char a[]);這種類型的聲明,編譯器內部將它當作int f(char *a);
所以可以對它傳入指標。若對它傳入數組,則數組退化為指標所以參數類型檢驗才能通過。
所以你即使聲明int f(char a[4]);看上去a是個數組,在函數體內寫a = 1;則違反了數組名是常量的規則,其實a = 1;是允許的因為int f(char a[4]);在編譯器看來是int f(char *a);其中的4被忽略了

最後一點要注意的是在一個源檔案中定義int a[5];
而在另一個源檔案1中寫下extern char *a是不合法的
因為數組與指標是兩個類型

-----------------------------------------------
最後羅索一句,樓主你所說&a[0]倒是和一般上下文中a等價都是int型指標。而&a則是int[5]型指標,我一直強調這點你明白了沒?

希望樓主好好學習,c中的數組可不好理解...餘下全文>>
 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.