数组指针、函数指针语法梳理

 
int   *a[10]   :数组指针。数组a里存放的是10个int型指针
int (*a)[10] :a是指针,指向一个数组。此数组有10个int型元素

int *a[10]
先找到声明符a,然后向右看,有[]说明a是个数组,再向左看,是int *,说明数组中的每个元素是int *。所以这是一个存放int指针的数组。

int(*a)[10]
先找到声明符a,被括号括着,先看括号内的(优先级高),然后向右看,没有,向左看,是*,说明s是个指针,什么指针?在看括号外面的,先向右看,有[] 是个数组,说明a是个志向数组的指针,再向左看,是int,说明数组的每个元素是int。所以,这是一个指向存放int的数组的指针。


int *p[10];
int (*q)[10];

printf( "*p[10]: %d\n ", sizeof(p));
printf( "(*q)[10]: %d\n ", sizeof(q));

结果是:
*p[10]: 40 //说明p是一个数组名
(*q)[10]: 4 //说明q是一个指针

#define _CRT_SECURE_NO_WARINGS
#include <stdlib.h>
#include<string.h>
#include<stdio.h>

void main()
{
	int a[10];
	printf("sizeof(a):%d\n", sizeof(a));
	typedef int(myTypeArray)[10];
	myTypeArray myArray;
	myArray[0] = 10;
	myArray[1] = 20;
	printf("myArray[0]:%d\n", myArray[0]);
	printf("myArray[1]:%d\n", myArray[1]);
	printf("sizeof(myArray[0]):%d\n", sizeof(myArray[0]));
	printf("sizeof(myArray):%d\n", sizeof(myArray));
	system("pause");
}

结论:1.myArray相当于 a[10]。
#define  _CRT_SECURE_NO_WARNINGS 
#include <stdlib.h>
#include <string.h>
#include <stdio.h>

void main01()
{
	int a[10]; //a代表的是数组首元素的地址  &a代表整个数组的地址  a+1 4  &a+1步长 40 .

	//
	{
		//定义一个数组类型
		typedef int(myTypeArray)[10]; //
		myTypeArray myArray;
		myArray[0] = 10;
		printf("%d \n", myArray[0]);
	}

	{
		//定义一个指针数组类型 
		typedef int(*PTypeArray)[10];  //int *p 

		PTypeArray myPArray; //sizeof(int) *10
		myPArray = &a;
		//int b = 10;
		//int *p = NULL;
		//p = &b;
		(*myPArray)[0] = 20;

		printf("a[0]: %d \n", a[0]);

	}

	{
		//定义一个指向 数组类型的指针 数组类的指针

		int(*MyPointer)[10]; //变量 告诉C编译器 给我分配内存
		//相当于:typedef int(*PTypeArray)[10];
		//		  PTypeArray myPArray;
		MyPointer = &a;
		(*MyPointer)[0] = 40;
		printf("a[0]: %d \n", a[0]);
	}


	printf("hello...\n");
	system("pause");
	return;
}

//函数指针语法梳理
//1 如何定义一个函数类型
//2 如何定义一个函数指针类型
//3 如何定义一个 函数指针  (指向一个函数的入口地址)

int add(int a, int b)
{
	printf("func add ....\n");
	return a + b;
}

void main()
{
	add(1, 2); //直接调用调用 //函数名就是函数的入口地址 

	//定义一个函数类型
	{
		typedef int (MyFuncType)(int a, int b); //定义了一个类型
		MyFuncType *myPointerFunc = NULL; //定义了一个指针, 指向某一种类的函数..

		myPointerFunc = &add;  //细节
		myPointerFunc(3, 4); //间接调用

		myPointerFunc = add;  //细节 //C 过程 兼容历史版本的原因
		myPointerFunc(3, 4); //间接调用
	}

	//定义一个函数指针类型
	{
		typedef int(*MyPointerFuncType)(int a, int b); //int * a = NULL;
		MyPointerFuncType myPonterFunc; //定义一个指针
		myPonterFunc = add;
		myPonterFunc(5, 6);
	}

	//函数指针 
	{
		int(*MyPonterFunc)(int a, int b); //定义了一个变量
		MyPonterFunc = add;
		MyPonterFunc(7, 8);

	}


	system("pause");
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值