C語言基礎-指標(三)指標陣列、陣列指標、函式指標、無型別指標與malloc
阿新 • • 發佈:2021-01-07
一、指標陣列
好多地址的集合
指標陣列本質還是個陣列
是一個存指標的陣列
在第一篇文章裡我們講了指標=地址,所以指標陣列也可以稱為地址陣列,存放的都是地址。
指標陣列的定義
int a = 1;
int b = 2;
int c = 3;
int *abc[3];
abc[0] = &a;
abc[1] = &b;
abc[2] = &c;
指標陣列abc[]中存放了a、b、c的地址
驗證
int i = 0;
int a = 1;
int b = 2;
int c = 3;
int *abc[3];
abc[0] = &a;
abc[1] = &b;
abc[2] = &c;
for(i=0;i<=2;i++)
{
printf("第%d個指標的內的值為%d\n",i,*abc[i]);
}
二、陣列指標
陣列指標本質還是個指標
是一個指向陣列的指標
也可稱為一個陣列的地址(陣列第一個元素的地址)
陣列指標的定義
int a[3] = {1,2,3};
int (*p)[3];//C語言寫法
p = a;
陣列指標的格式要求很強
陣列指標的大小必須與指向的陣列大小一致
int a[3] = {1,2,3};
int b;
int (*p)[3];//C語言寫法
p = b;
liunx、gcc編譯環境下,會出現warning
我們在文章1中講過,當指標與陣列的型別相同時,若指標指向的是陣列的首地址,則可以通過指標遍歷整個陣列,對於這種情況,不能稱該指標為陣列指標。
== 陣列指標與普通指標(上述的指標)最大的區別==
---------------------------------偏移值------------------------------------
陣列指標的偏移值(+1後地址與原地址的差值)為指向陣列的大小
int a[3] = {1,2,3};
int (*p)[3];
int* b = &a[0];
p = a;
printf("指標p指向的初始地址%p指標b指向的初始地址%p\n",p++,b++);
printf("指標p指向的初始地址%p指標b指向的初始地址%p\n",p,b);
p自增1,地址+12位元組,b自增1,地址+4位元組。
使用場景:二維陣列
三、函式指標
存放函式的地址
作用:呼叫函式
函式指標的定義:
void printfll()
{
printf("abllalala\n");
}
int main()
{
void (*swap)();
swap = printfll;
(*printfll)();
}
呼叫函式的方法:
方法一:通過呼叫函式名來呼叫函式
void printfll()
{
printf("abllalala\n");
}
int main()
{
printfll();
system("pause");
return 0;
}
方法二:通過指標來呼叫函式
void printfll()
{
printf("abllalala\n");
}
int main()
{
void (*a)();
a = printfll;
(*a)();
system("pause");
return 0;
}
函式指標和陣列指標一樣格式要求很強
需注意指標型別與函式型別一致,輸入要求也需一致
void printfll()
{
printf("abllalala\n");
}
int swap(int a,int b)
{
printf("swap\n");
}
int main()
{
int (*a)(int a, int b);
a = printfll;
(*a)();
a();
system("pause");
return 0;
}
使用int型返回值兩個輸入指標呼叫無返回值無輸入函式出現錯誤
四、無型別指標與malloc
void:無型別,void main()不是沒有返回值,返回值是void型別(無型別)
運用場景:malloc函式
malloc:malloc的全稱是memory allocation,中文叫動態記憶體分配,用於申請一塊連續的指定大小的記憶體塊區域以void*型別返回分配的記憶體區域地址,當無法知道記憶體具體位置的時候,想要繫結真正的記憶體空間,就需要用到動態的分配記憶體,且分配的大小就是程式要求的大小。
int n = 3;
int* a = (int* )malloc(n * sizeof(int));//第一句
int a[n];//第二句
第一句和第二句可以實現相同功能,但第二句並不推薦,當無法確定陣列需要的記憶體空間時可用malloc分配。
int i = 0;
int n = 3;
int* a = (int* )malloc(n * sizeof(int));
for(i=1;i<=3;i++){
scanf("%d",a);
printf("第%d次為%d\n",i,*a++);
}