標籤: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;
}