C/C++基礎知識(一)數組和指針

//歡迎批評微笑
申請連續的二維數組,提高訪問效率。

#include "stdafx.h"
#include "time.h"
#include  <stdlib.h>


//方法一: 【這樣可能不連續】
//列大小固定 的二維數組可以申請一維數據並將指針強轉成二維數組
//(http://blog.csdn.net/shanxuezhe)


int main()
{
printf("  列大小固定的二維數組可以申請一維數據並將指針強轉成二維數組\n");  
printf(" -- by MoreWindows( http://blog.csdn.net/shanxuezhe ) --\n\n");  


//列值固定
const int MAXCOL = 3;


int nRow;
printf("請輸入二維數組的行數(列值固定爲%d): ", MAXCOL);
scanf("%d", &nRow);


//申請一維數據並將其轉成二維數組指針
int *pp_arr = new int[nRow * MAXCOL];
int (*p)[MAXCOL] = (int(*)[MAXCOL])pp_arr;


//爲二維數組賦值
int i, j;
for (i = 0; i < nRow; i++)
for (j = 0; j < MAXCOL; j++)
p[i][j] = i + j;


//輸出二維數組
for (i = 0; i < nRow; i++)
{
for (j = 0; j < MAXCOL; j++)
printf("%5d", p[i][j]);
putchar('\n');
}


system("pause");//避免dos一閃而過


//釋放資源
delete[] pp_arr;
return 0;
}

//方法二: 【空間連續,提高訪問效率】
//C語言中動態的申請二維數組 malloc free
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

//動態申請二維數組
template <typename T>
T** malloc_Array2D(int row, int col)
{
int size = sizeof(T);
int point_size = sizeof(T*);
//先申請內存,其中point_size * row表示存放row個行指針的空間大小
T **arr = (T **) malloc(point_size * row + size * row * col);
if (arr != NULL)
{
memset(arr, 0, point_size * row + size * row * col);//初始化分配的數組空間
T *head = (T*)((int)arr + point_size * row);//確定數組頭位置
while (row--)
arr[row] = (T*)((int)head + row * col * size);//確定每行的頭地址
}
return (T**)arr;
}
//釋放二維數組
void free_Aarray2D(void **arr)
{
if (arr != NULL)
free(arr);
}
int main()
{
printf("  C語言中動態的申請二維數組 malloc free\n");  
printf(" -- by MoreWindows( http://blog.csdn.net/MoreWindows ) --\n\n");


printf("請輸入行列(以空格分開): ");
int nRow, nCol;
scanf("%d %d", &nRow, &nCol);


//動態申請連續的二維數組
int **p = malloc_Array2D<int>(nRow, nCol);


//爲二維數組賦值
int i, j;
for (i = 0; i < nRow; i++)
for (j = 0; j < nCol; j++)
p[i][j] = i + j;


//輸出二維數組
for (i = 0; i < nRow; i++)
{
for (j = 0; j < nCol; j++)
printf("%4d ", p[i][j]);
putchar('\n');
}


free_Aarray2D((void**)p);
return 0;





提示【學習了】========================================================================================================================

VC調試時按Alt+8、Alt+6和Alt+5,打開彙編窗口、內存窗口和寄存器窗口看每句C對應的彙編、單步執行並觀察相應內存和寄存器變化,這樣過一遍不就啥都明白了嗎。
對VC來說,所謂‘調試時’就是編譯連接通過以後,按F10或F11鍵單步執行一步以後的時候,或者在某行按F9設了斷點後按F5執行停在該斷點處的時候。
(Turbo C或Borland C用Turbo Debugger調試,Linux或Unix下用GDB調試時,看每句C對應的彙編並單步執行觀察相應內存和寄存器變化。)

想要從本質上理解C指針,必須學習彙編以及C和彙編的對應關係。

從彙編的角度理解和學習C語言的指針,原本看似複雜的東西就會變得非常簡單!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章