C语言学习笔记:数组指针的三种定义方式、二维数组的地址、函数指针与指针函数

数组指针的定义方式:

1、定义数组类型,根据类型定义指针变量

    int a[10] = { 0 };             //1,定义数组类型,根据类型定义指针变量
	typedef int A[10];             //A数组类型
	A *p = NULL;                   //p数组指针类型变量
   	//p = a;                       //a代表首元素地址, a和&a一样,最终也是当作&a,警告
	p = &a;                        //&a代表整个数组首地址

2、先定义数组指针类型,根据类型定义变量。

  
     int a[10] = { 0 };               //2,先定义数组指针类型,根据类型定义变量。
	typedef int(*P)[10];              //和指针数组写法很类似 多了()
	P q;	                          //()和[]优先级一样
	q = &a;                           //指向数组的指针,它有typedef,所以它是一个数组指针类型

3、直接定义数组指针变量

	int a[10] = { 0 };                 //3,直接定义数组指针变量
    int(*q)[10];                       //指向数组的指针,没有typedef,所以它是一个数组指针变量
    q = &a;                            //q是数组指针变量                                

数组地址概念:
二维数组名的地址含义

    int a[4];                            //a是首元素地址, &a是整个数组地址

	int a[][4] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12 }; //a是首行地址,&a是整个数组地址   
	//二维数组组名代表第0行的首地址(区别于第0行首元素地址,虽然值一样)
	//a                代表第0行首地址
	//a+i              代表第i行地址
	//*(a+i)         等价于  a[i]      代表第i行首元素地址
	//*(a+i)+j        等价于 &a[i][j]   第i行第j列元素地址
	//*(*(a+i)+j )   等价于a[i][j]    第i行第j列元素的值
	

二维数组的线性存储

     int a[][4] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12 };
	 int *b = a;
	 int i = 0;
	 for (i = 0; i < sizeof(a) / sizeof(a[0][0]); i++)
      {
		    printf("%d \n", b[i]);//结果是1到12,证明了存储的线性
   	  }

定义并打印一个数组指针

    int a[][10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12 };
    typedef int(*P)[10];
	P p;
	p = a;
	int i = 0;
	int j = 0;
	int n = sizeof(a) / sizeof(a[0]);
	int nj = sizeof(a[0]) / sizeof(a[0][0]);
	for (i = 0; i < n; i++)
	{
		for (j = 0; j < nj; j++)
		{		
			printf("%d  ", *(*(p + i) + j));    //printf("%d  ", p[i][j]);
		}
		printf("\n");
	}
       //结果: 1  2 3 4 5 6 7 8 9 10 
               11 12 0 0 0 0 0 0 0 0

二维数组做形参的注意点见之前内容。注:不可直接使用二级指针,步长不一样。

指针函数

int *fun()//指针函数,即返回值是指针类型的函数
{
	int *p = (int *)malloc(sizeof(int));
	return p;
}

函数指针

int fun(int a)
{
	printf("a============%d\n", a);
	return 0;
}

int main()
{
	//函数指针 它是指针  指向函数的指针
	//定义函数指针变量有3种方式
	
	//1   先定义函数类型  根据类型定义指针变量(不常用)
	typedef int FUN(int a);             //FUN函数类型    //有typedef是类型   没有是变量
	FUN *p1 = NULL;                     //函数指针变量
	p1 = fun;                           //p1指向fun函数
	fun(5);                             //传统方式
	p1(6);                              //函数指针变量调用方法

	//2 先定义函数指针类型   根据类型定义指针变量(常用)
	typedef int(*PFUN)(int a);            //PFUN函数指针类型
	PFUN p2 = fun;
	p2(7);

	//3  直接定义函数指针(常用)
	int(*p3)(int a) = fun;
	p3(8);

	int(*p4)(int a);
	p4 = fun;
	p4(9);
	
	printf("\n");
	system("pause");
	return 0;
}

函数指针的应用(多态)

#define _CRT_SECURE_NO_WARNINGS
#include
#include
#include
#include
void add()
{
	printf("add11111111111111\n");
}
void minus()
{
	printf("minus2222222222222\n");
}
void multi()
{
	printf("multi33333333333333\n");
}
void divide()
{
	printf("divide44444444444444\n");
}
void myexit()
{
	exit(0);
}

int main()
{
	//函数指针数组
	void(*fun[5])() = { add, minus, multi, divide, myexit };
	//指针数组
	char *buf[] = { "add", "min", "mul", "div", "exit" };

	char cmd[100];
	int i = 0;
	while (1)
	{
		printf("请输入指令:");
		scanf("%s", cmd);

		for (i = 0; i < 5; i++)
		{
			if (strcmp(cmd, buf[i]) == 0)
			{
				fun[i]();
				break;//跳出for循环
			}
		}
	}
	printf("\n");
	system("pause");
	return 0;
}

你可能感兴趣的:(C语言笔记)