指针和数组/指针和函数

一级指针

比如:

//字符指针 
char ch = 'w';
char *p = &ch;
//字符串指针
char * str = "hello."; // str指向h的地址;

二级指针

指向指针的指针,二级指针又分为指向指针变量的指针和指向数组的指针。
比如:

char ch = 'w';
char *p = &ch;
char**pp = &p;

指针数组

数组中的所有元素保存的都是指针
比如:

int a = 1, b = 2, c = 3;
int *arr[] = {&a, &b, &c};	//[ ]的优先级高于*,该定义形式应该理解为:int *(arr[])

数组指针

指向数组的指针
比如:

int (*p)[10];

指针和数组

char str1[] = "hello bit.";   
char str2[] = "hello bit.";   
char *str3 = "hello bit.";  
char *str4 = "hello bit.";
 str1 != str2;str3 = str4;

函数指针

存放函数的地址

void (*pfun)();

pfun先和*结合,说明pfun是指针,指针指向的是一个函数,指向的函数无参数,返回值 类型为void。

函数指针数组

函数的地址存到一个数组中,那这个数组就叫函数指针数组

int (*parr[10]])();

parr 先和 [] 结合,说明parr是数组,数组的内容是什么呢? 是 int (* )() 类型的函数指针。
函数指针数组的用途:转移表

#include <stdio.h>
 int add(int a, int b) { return a + b; } 
int sub(int a, int b) {return a - b; }
 int mul(int a, int b) {return a*b; } 
int div(int a, int b) {return a / b; }
 int main() {
      int x, y;
      int input = 1;
      int ret = 0;
      int(*p[5])(int x, int y) = { 0, add, sub, mul, div }; //转移表
      while (input)
      {
           printf( "  1:add           2:sub  \n" );
           printf( "  3:mul           4:div  \n" );
          printf( "请选择:" ); 
          scanf( "%d", &input);
           if ((input <= 4 && input >= 1))
           {
            printf( "输入操作数:" );
               scanf( "%d %d", &x, &y);
               ret = (*p[input])(x, y);
           }
           else
                printf( "输入有误\n" );
           printf( "ret = %d\n", ret);
       }
       return 0;
 }

指向函数指针数组的指针

指向函数指针数组的指针是一个指针 指针指向一个数组,数组的元素都是函数指针;

void test(const char* str) {  printf("%s\n", str); } 
int main() 
{
  //函数指针
pfun  void (*pfun)(const char*) = test;
  //函数指针的数组pfunArr 
 void (*pfunArr[5])(const char* str);
  pfunArr[0] = test;
  //指向函数指针数组pfunArr的指针ppfunArr  
void (*(*ppfunArr)[10])(const char*) = &pfunArr;
  return 0;
 }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值