1數組概念
1)元素類型角度:數組是相同類型的變量的有序集合 測試指針變量占有記憶體空間大小
2)記憶體角度:聯系的一大片記憶體空間
數組初始化
數組元素的個數可以顯示或隐式指定, 分析數組初始化{0}與memset比較。
{0} 與memset 耗時差不多,但{0} 可能有移植性問題,雖然絕大多數編譯器看到{0} 都是将數組全部初始化為0, 但是不保證所有編譯器都是這樣實作的;推薦使用memset方法。
數組名的技術盲點
1)數組首元素的位址和數組位址是兩個不同的概念
2)數組名代表數組首元素的位址,它是個常量。
解釋如下:變量本質是記憶體空間的别名,一定義數組,就配置設定記憶體,記憶體就固定了。是以數組名起名以後就不能被修改了。
3)數組首元素的位址和數組的位址值相等
4、怎麼樣得到整個一維數組的位址?
C語言規定:
Int a[10];
printf(“得到整個數組的位址a: %d \n”, &a);
printf(“數組的首元素的位址a: %d \n”, a);
2數組類型、數組指針類型、數組指針類型變量
數組類型
1資料類型分為基礎、非基礎,思考角度應該發生變化
2 C語言中的數組有自己特定的類型
數組的類型由元素類型和數組大小共同決定
例:int array[5]的類型為int[5]
typedef int(MYINT5)[5]; //int
typedef float(MYFLOAT10)[10];
數組定義:
MYINT5i Array; int array[5];
MYFLOAT10fArray
數組指針類型
數組指針用于指向一個數組。
定義數組指針 有三種
1)通過數組類型定義數組指針:
typedef int(ArrayType)[5]; int *a
ArrayType* pointer;
{
int a[5];
//聲明一個數組類型
typedef int(MYINT5)[5];
//用數組類型 加*,定義一個數組指針變量
MYINT5 *array;
array = &a;
for (i=0; i<5; i++)
{
(*array)[i] = i;
}
//
for (i=0; i<5; i++)
{
printf("\n%d %d", a[i], (*array)[i]);
}
}
2) 聲明一個數組指針類型
typedef int (*MyPointer)[5];
MyPointer myPoint;
{
int b[5];
//聲明一個數組指針類型
typedef int (*MyPointer)[5];
//用數組指針類型,去定義一個變量
MyPointer mypoint ;
mypoint= &b;
for (i=0; i<5; i++)
{
(*mypoint)[i] = i;
}
//
for (i=0; i<5; i++)
{
printf("\n%d %d", b[i], (*mypoint)[i]);
}
}
3)直接定義:int (*pointer)[n];
pointer 為數組指針變量名
type 為指向的數組的類型
n 為指向的數組的大小
{
int c[5];
//直接聲明一個數組指針變量
int (*pointer)[5] = &c;
for (i=0; i<5; i++)
{
(*pointer)[i] = i;
}
for (i=0; i<5; i++)
{
printf("\n%d %d", c[i], (*pointer)[i]);
}
}
3多元數組本質技術推演
void main222()
{
int a[3][5];
int c[5]; //&c + 1; 表示指針向後移4*5個機關
int b[10]; //b代表數組首元素的位址 &b代表這個數組的位址 &b+1相當于 指針後移4*10個機關
//a的本質是一個數組指針,每次往後跳一維的維數
printf("a:%d, a+1:%d \n", a, a+1); //4*5
}
char cbuf[30]; // cbuf(1級指針) 代表數組首元素的位址。&cbuf(二級指針) 代表整個數組的位址.
char array[10][30]; //array是二級指針
array 二維數組的首位址
(array+i) //相當于 整個第i行的數組位址 //二級指針 &cbuf
(*(array+i))//一維數組的首位址 cbuf
(*(array+i))+j //相當于第i行第j列的位址《==》&array[i][j]
*((*(array+i))+j) //相當于第i行第j列的值<====>array[i][j]