<深入理解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;
}


相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.