1.數(shù)組名
數(shù)組首元素的地址和數(shù)組地址是兩個(gè)不同的概念
數(shù)組名代表數(shù)組首元素的地址,它是個(gè)常量.
變量本質(zhì)是內(nèi)存空間的別名,一定義數(shù)組,就分配內(nèi)存,內(nèi)存就固定了。所以數(shù)組名起名以后不能被修改了。
數(shù)組首元素的地址和數(shù)組的地址值相等。
1.1怎么樣得到整個(gè)一位數(shù)組的地址?
int a[10];
printf("得到整個(gè)數(shù)組的地址a:%d\n",&a);
printf("數(shù)組的首元素的地址a:%d\n,a);
2.數(shù)組類(lèi)型
數(shù)組的類(lèi)型由元素類(lèi)型和數(shù)組大小共同決定
int array[5] 的類(lèi)型為 int[5]
#include <stdio.h>
/*
typedef int(MYINT5)[5];
typedef float(MYFLOAT10)[10];
數(shù)組定義:
MYINT5 iArray; 等價(jià)于 int iArray[5];
MYFLOAT10 fArray; 等價(jià)于 float fArray[10];
*/
/*定義 數(shù)組類(lèi)型,并用數(shù)組類(lèi)型定義變量*/
int main(void)
{
typedef int(MYINT)[5];
int i = 0;
MYINT array;
for(i = 0 ; i < 5; i++)
{
array[i] = i;
}
for(i = 0;i < 5;i++)
{
printf("%d ",array[i]);
}
return 0;
}
3.數(shù)組指針和指針數(shù)組
3.1指針數(shù)組
char *point_array[4];
(char *)point_array[4];
指針數(shù)組,是一個(gè)數(shù)組,里面的每一個(gè)元素都是一個(gè)指針。(多個(gè)指針)

1.png
3.2數(shù)組指針
int (*array_point)[4];
是一個(gè)指針,指向一個(gè)數(shù)組

2.png
指針本是一種類(lèi)型,但又說(shuō)什么類(lèi)型的指針,只不過(guò)是說(shuō)指針?biāo)赶虻臄?shù)據(jù)是什么類(lèi)型而已。那么指向數(shù)組類(lèi)型的指針,就只好叫數(shù)組指針
3.3定義數(shù)組指針
int a[10]; // a的類(lèi)型是一個(gè)指向int類(lèi)型的指針
數(shù)組名a是數(shù)組首元素的起始地址,但并不是數(shù)組的起始地址。
&a; //&a的類(lèi)型是一個(gè)指向數(shù)組int[10]類(lèi)型的指針
通過(guò)將取地址符&作用域數(shù)組名可以得到整個(gè)數(shù)組的起始地址
1)通過(guò)數(shù)組類(lèi)型定義數(shù)組指針:
typedef int(ArrayType)[5]; //定義類(lèi)型ArrayType為int[5]類(lèi)型
ArrayType* pointer;//那么指向ArrayType的指針就是指向int[5]類(lèi)型的指針
2) 通過(guò)數(shù)組指針定義數(shù)組指針
typedef int (*MyPointer)[5]; //定義類(lèi)型MyPointer為指向int[5]類(lèi)型的指針
MyPointer myPoint; //那么?用這種類(lèi)型的指針定義的便利都是指向int[5]類(lèi)型的
3)直接定義
int (*pointer)[5];
3.4數(shù)組指針有什么用?
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void test()
{
// int //0維數(shù)組,一級(jí)指針
// int[10] //一維數(shù)組,二級(jí)指針
// int[10][20]//二維數(shù)組,三級(jí)指針
int a[3][4];
//a是一個(gè)指針,指向此二維數(shù)組首元素(int[4])的地址,int (*p)[4] --->二級(jí)指針,指向一維數(shù)組
//&a也是一個(gè)指針,指向此二維數(shù)組(int[3][4])的地址,int(*p)[3][4] --->三級(jí)指針,指向一個(gè)二維數(shù)組
//一個(gè)數(shù)組指針如果是幾級(jí)指針,就是指向比他低一個(gè)維度的數(shù)組
}
int main(int argc, char const *argv[])
{
//定義一個(gè)指針數(shù)組
//char *pointer_array[4] = {NULL,NULL,NULL,NULL};//在棧上
char *pointer_array[4] = {NULL};//數(shù)組,一定要記得加大括號(hào)
int i = 0;
for (i = 0; i < 4; ++i)
{
pointer_array[i] = malloc(100);
}
//定義一個(gè)數(shù)組指針
//方法一:
//通過(guò)數(shù)組類(lèi)型定義一個(gè)數(shù)組指針
typedef int(ARRAY_CHAR_4)[4];
ARRAY_CHAR_4 array = {0};//int[4]類(lèi)型 array是數(shù)組首元素的地址
ARRAY_CHAR_4 *p = NULL; //數(shù)組的地址 (int[4]) *p = NULL
p = &array;//array int * &array-->(int[4])*
for (i = 0; i < 4; ++i)
{
(*p)[i] = i;//等價(jià)于 array[i] = i;
// p[i] = i;為int[4] *(p+i)==p[i]
}
for (i = 0; i < 4; ++i)
{
printf("%d\n",array[i]);
}
int size = 0;
size = sizeof(ARRAY_CHAR_4);
printf("ARRAY_CHAR_4 = %d\n",size);//輸出16
//方法二:
//數(shù)組指針
typedef int(*ARRAY_CHAR_4_POINTER)[4];//一個(gè)int,指向int[4]
ARRAY_CHAR_4_POINTER array_pointer = &array;
size = sizeof(ARRAY_CHAR_4_POINTER);
printf("ARRAY_CHAR_4_POINTER = %d\n",size);//輸出4
for (i = 0; i < 4; ++i)
{
(*array_pointer)[i] = i;
}
for (i = 0; i < 4; ++i)
{
printf("%d\n",array[i]);
}
//方法三
int(*array_p)[4] = NULL//直接定義一個(gè)數(shù)組指針
array_p = &array;
for (i = 0; i < 4; ++i)
{
(*array_p)[i] = i;
}
for (i = 0; i < 4; ++i)
{
printf("%d\n", array[i]);
}
return 0;
}