指针数组和函数指针的用法和定义

一.指针数组

有一个数组,其里面的元素类型都为指针(地址)。

例:const  char* pp[2] = { "asd","1123" };  //指针数组  

这里的字符串常量其实就是它的地址。

1.定义:char *p[2]={"asd","1123"}; 

[]的优先级高,所以先和p结合表明其是一个数组,*表示其数组元素为指针,char为指针类型。

2.元素访问:

pp[0]代表数组第一个元素(指针)即第一个字符串的地址:pp[0]+1则代表第一个字符串中s的地址

 输出结果:

 2.指针具有加一能力,故我们下面讨论每种指针的含义。

 运行结果:

 分析:

pp相当于数组名,和普通数组一样pp[0]代表第一个元素,此时pp[0]="asd"的地址,pp+i=pp[i]

对于一维数组a,a,&a,&a[0]他们的地址一样。而地址就是指针,所以pp,pp[0],pp[1]都是指针。

系统告诉我们pp这个数组名是一个二级指针(它是pp[0]的地址,而pp[0]也是地址), 对其做一次解引用即*pp=pp[0],再次解引用即**pp='a'.*(*(pp+i)+j)=*(pp[i]+j).

3.缺点:无法对字符串中的数据进行改动。

测试用例代码:

#include <stdio.h>
#include <stdlib.h>
#include <strinf.h>
int main()
{
	 
	const  char* pp[2] = { "asd","1123" };  //指针数组  
	printf("pp[0]=%s\n", pp[0]);
	printf("*(pp[0]+2)=%c\n", *(pp[0]+2));
	printf("*(pp[1]+0)=%c\n", *(pp[1] + 1));
	printf(" pp[1]=%s\n",pp[1]);
	printf("pp=%s\n", pp);
	printf("*pp=%s\n", *pp);
	printf("*pp+1=%s\n", *pp+1);
	printf("*(pp+1)=%s\n", *(pp + 1));
	printf("%d\n", strlen(pp));
	printf("{pp[0] + 1}地址 =%p\n", pp[0] + 1 );
	printf("pp地址=%p\n", pp);
	printf("&pp地址=%p\n", &pp);
	printf("&pp+1 地址%p\n", &pp + 1);
	printf("(pp+1)地址%p\n", pp + 1);
	printf("pp[0]地址=%p\n", pp[0]);
	printf("&pp[0]地址=%p\n", &pp[0]);
	printf("pp[1]地址=%p\n", pp[1]);
	printf("*pp[1]地址=%p\n",*( pp+1));
	printf("*pp地址=%p\n", *pp); 
	system("pause");

}

二.函数指针

在程序中定义了一个函数,那么在编译时系统会自动为其分配一段空间,这段存储空间的首地址就成为这个函数的地址,并且函数名表示的就是这个地址。地址就是指针,所以可以用一个指针变量来存放。

先来了解下一下typedef,其实就是为了偷懒,简化代码用的,例如:定义一个无符号长整型 数据

 
#include <stdio.h>
 
typedef unsigned long long int  uint_64 ;
int main()
{
	unsigned long long int a = 12;
	uint_64 b = 12;
}

用变量替换类型名,使其成为该类型名的别名,可简化代码规模。

测试用例代码:

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

//函数指针
typedef unsigned long long int  uint_64;
typedef int(*Parr)[3];
typedef int(*Px)(double);

int xsug(double a)
{
	printf("xsug\n");
	return 2;
}
int xsuj(double b)
{
	printf("xsuj\n");
	return 1;
}
int main()
{
	unsigned long long int a = 12;
	uint_64 b = 12; 
	int ar[] = { 1,3,5 };
	Parr Pc = &ar;
	int(*p)[3] = &ar;
	int(*q)(double) = NULL;
	Px pq = NULL;
	char s;
	scanf("%c", &s);
	switch (s) {
	case '1': q = xsug;  pq = xsug; break;
	case '2': q = xsuj; pq = xsuj;  break;
	default: break;
	}
    printf("%p,%p\n",q,pq);
	q(1.0);
	pq(2.0);

}

1.定义格式:(函数返回类型)(*指针变量)(函数参数列表) .             注:函数参数列表可只写类型

有两种定义:使用typedef重定义,或者不使用。测试代码均已给出;

 2.用法

平时调用函数时:函数名(实参);得到了函数名地址后,可以用: 地址(实参)来调用函数。

测试结果:

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值