1. 程式人生 > 其它 >C語言基礎-指標(三)指標陣列、陣列指標、函式指標、無型別指標與malloc

C語言基礎-指標(三)指標陣列、陣列指標、函式指標、無型別指標與malloc

技術標籤:指標c語言

一、指標陣列

好多地址的集合

指標陣列本質還是個陣列
是一個存指標的陣列
在第一篇文章裡我們講了指標=地址,所以指標陣列也可以稱為地址陣列,存放的都是地址。

指標陣列的定義

	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++);
    }

在這裡插入圖片描述

malloc的特殊說明:

記憶體洩漏

記憶體洩漏的原因:malloc不斷分配記憶體,作業系統不回收,無free();導致計算機記憶體損耗殆盡。

解決方法:一個malloc();配一個free();分配記憶體空間使用過後及時回收

free():的作用就是釋放malloc()產生的記憶體