不同類型的指針

2020-08-12 10:23:15

指針陣列

#include <stdio.h>
#include <stdlib.h>
int main()
{
	int a = 3;
    int b = 45;
    int c = -9;
    
    int* parry[3];
    parry[0] = &a;
    parry[1] = &b;
    parry[2] = &c;
    int i;
    for(i=0;i<3;i++)
    {
		printf(" %d ",*(parry[i]));
    }
    putchar('\n');
	system("pause");
	return 0;
}

指針陣列按照我們白話文說的就是,指針的陣列,說白了它總的就是一個數組,承載了多個指針變數的陣列。定義方式:int* parry[3]

陣列指針

#include <stdio.h>
#include <stdlib.h>
int main()
{
	int a[3]={8,23,3};
    int* p2;
    int (*p)[3];
    p=a;
    p2=a;
    printf("地址一:%p\n",a);
    printf("地址二:%p\n",&a[0]);
    printf("地址三:%p\n",p);
    printf("地址四:%p\n",p2);
    
    printf("陣列指針的偏移:%p\n",++p);
    printf("普通指針的偏移:%p\n",++p2);
    system("pause");
	return 0;
}

結果:在这里插入图片描述
陣列的指針,顧名思義就是承載着陣列量的一個指針,爲什麼這麼說呢,我們都知道指針的偏移是有規律的,什麼數據型別的指針就偏移相應的位元組量,正因爲如此,在普通指針中如*p2它的偏移量就應該是(0060FEE0-0060FEDC)4,也就是一個整形變數,而在陣列指針中卻是(0060FEE8-0060FEDC)12,也就是sizeof(3x(int))個位元組,所以看得出,陣列指針偏移量就是陣列的個數

函數指針

無參數的函數指針

#include <stdio.h>
#include <stdlib.h>

void printWelcom()
{
	printf("祖國加油\n");
}
int main()
{
	printWelcom();
    void (*p)();
    p=printWelcom;
    p();
    (*p)();
    printf("%p\n",p);

含參數的函數指針

#include <stdio.h>
#include <stdlib.h>

int add(int a,int b)
{
	return a+b;
}
int main()
{
    int a=3;
    int b=3;
    int ret;
    int ret2;
    int ret3;
    ret=add(a,b);
    int (*padd)(int a,int b);
    padd=add;
    ret2=padd(a,b);
    ret3=(*padd)(a,b);
    printf("指針函數:%d\n",ret);
    printf("指針函數:%d\n",ret2);
    printf("指針函數:%d\n",ret3);
    printf("%p\n",padd);
    printf("%p\n",&add);
	system("pause");
	return 0;
}

在这里插入图片描述
可見,定義一個函數指針的方式類似於定義一個函數,該指針指向哪個函數,就按照這個函數的型別去定義,這樣一來指針就指向了該函數,也就成了函數指針,對於函數指針可以直接用padd(a,b)這樣的方式呼叫,也可以(*padd)(a,b)來呼叫

無型別指針

malloc函數(動態分配記憶體)

malloc函數是用來在C語言中動態分配記憶體的,一般來說malloc的格式是這樣的:void malloc(),()內填入想要開闢的空間大小,而在實際運用當中一般都是把無型別換成整形,實型或者字元型等等。

無型別指針

#include <stdio.h>
#include <stdlib.h>
int main()
{
    int n;
    int i;
    printf("請輸入你想要開闢的陣列空間大小:");
    scanf("%d",&n);
    int *parry=(int*)malloc(n*sizeof(int));//利用指針,malloc函數定義陣列的方法
    for(i=0;i<n;i++)
    {
		printf("請輸入第%d個數:\n",i+1);
        scanf("%d",&parry[i]);
    }
    for(i=0;i<n;i++)
    {
		printf("第%d個數:%d\n",i+1,(*parry)++);
    }
	system("pause");
	return 0;
}

無型別的指針定義之後,用malloc開闢的空間可以用來當做一個數組來使用,換句話說陣列的定義除了傳統的直接定義,還可以用分配空間給指針的方式來定義一個數組