不飞则已,一飞冲天;不鸣则已,一鸣惊人。这篇文章主要讲述指针的进阶相关的知识,希望能为你提供帮助。
一 .字符指针
二.数组指针,指针数组
三.数组传参 指针传参
四.函数指针
五.函数指针数组
六.指向函数指针数组的指针
下面开始本节的内容
一.字符指针
在指针的类型中有一种指针类型的字符指针
char*
int main(void)
char ch = w;
char* pc = & ch;
*pc = w;
return 0;
第二种形式
int main(void)
char* pstr = "hello Gerald!";
printf("%s\\n", *pstr);
return 0;
1.这两个变量main的栈上开辟空间,ch的地址高,pc的地址低
2.第二个里面的并不是将字符串放到指针里面,而是在字符串常量区创建了这个字符串,
将这个字符串的首地址pstr指针,而且这个字符串在读区,不能修改字符串
面试题分析
#include < stdio.h>
int main()
char arr1[] = "abcdef";
char arr2[] = "abcdef";
const char* p1 = "abcdef";
const char* p2 = "abcdef";
if (arr1 == arr2)
printf("hehe\\n");
else
printf("haha\\n");
/*if (p1 == p2)
printf("hehe\\n");
else
printf("haha\\n");
*/
return 0;
?因为比较的是地址,所以arr1和arr2都是将一个字符串放在了一个数组里面,所以这两个数组的首地址是不相同的?。?但是在p1和p2是指针类型,字符串是字符常量去创建好的,并且将首地址给了p1和2,所以他们的首地址是相同的。?
二.数组指针,指针数组
#include< stdio.h>
//void print1(int arr[3][5], int x, int y)
//
//int i = 0;
//int j = 0;
//for (i = 0; i < x; i++)
//
//for (j = 0; j < y; j++)
//
//printf("%d ", arr[i][j]);
//
//printf("\\n");
//
//
void print2(int(*p)[5], int x, int y)
int i = 0;
int j = 0;
for (i = 0; i < x; i++)
for (j = 0; j < y; j++)
printf("%d ", p[i][j]);
printf("\\n");
int main()
int arr[3][5] =1,2,3,4,5,2,3,4,5,6,3,4,5,6,7 ;
//print1(arr, 3, 5); //arr 是数组名 数组名是首原属的地址
print2(arr, 3, 5);
return 0;
#include < stdio.h>
int main()
int arr[10] =1,2,3,4,5,6,7,8,9,10 ;
int i = 0;
int* p = arr;
for (i = 0; i < 10; i++)
printf("%d ", p[i]);
printf("%d ", arr[i]);
printf("%d ", *(p+i));
printf("%d ", *(arr + i));
return 0;
//指针数组是数组,用来存放指针
#include < stdio.h>
//int main()
//
//int arr[10] =0 ; //整形数组
//char ch[5] =0 ; //字符数组
//int* p[4]; //存放整形指针的数组,指针数组
//char* p1[5]; //存放字符指针的数组,指针数组
//return 0;
//
int main()
//int* p = NULL; //p是整形指针,指向整形中的指针可以存放整形的地址
//char* pc = NULL; //pc是字符指针,指向字符的指针,可以存放字符的地址
//int arr[10] =0 ;
//arr//首元素地址
//& arr[0]//首元素的地址
//& arr//数组的地址
int arr1[] =1,2,3,4,5 ;
int arr2[] =2,3,4,5,6 ;
int arr3[] =3,4,5,6,7 ;
int* p[] =arr1,arr2,arr3 ;
int i = 0;
for (i = 0; i < 3; i++)
int j = 0;
for (j = 0; j < 5; j++)
printf("%d ", *(p[i] + j));
printf("\\n");
return 0;
数组指针的使用
数组本身的元素类型加元素的个数共同决定数组类型。
数组传参时会降维成指向其内部元素类型的指针,前提是我们认为所有的数组都是一维的。
数组传参时只能省略一维数组的下标(第一个方括号)的值。
【指针的进阶】三.数组传参,指针传参
数组传参
#include< stdio.h>
////void test (int arr[])
////
////void test(int arr[10])
////
//void test(int *arr)
//
//
//int main()
//
//int arr[10] =0 ;
//test(arr);
//
//
void test(int arr[3][5])
void test(int arr[][5])
void test(int arr[3][])//这种方式错误,二维数组中行可以省略,但是列不可以省略
int main()
int arr[3][5] =0 ;
test(arr);
test1(arr);
test2(arr);
return 0;
#include< stdio.h> //指针传参
void print(int *p,int sz)
int i=0;
for(i=0; i< sz; i++)
printf("%d\\n",*(p+i));
int main()
int arr[10] =1,2,3,4,5,6,7,8,9;
int *p=arr;
int sz=sizeof(arr)/sizeof(arr[0]); //一级指针p,传给函数
print(p,sz);
return 0;
四.函数指针
函数指针--指向函数的指针--存放函数地址的一个指针
函数指针
#include< stdio.h>
int Add(int x,int y)
int z=0;
z=x+y;
return z;
int main()
int a=10;
int b=20;
int arr[10]=0;
//& arr;
//arr;
//Add(a,b);
//printf("%d\\n",Add(a,b));
//& 函数名和函数名都是函数的地址
printf("%p\\n",& Add);
printf("%p\\n",Add);
return 0;
五.函数指针数组
函数指针数组,顾名思义,它是一个数组,这个数组里的元素是函数指针类型。
int (*pfun[10])();
pfun先和[]结合表示为一个数组,然后在和*结合,意为指针数组,最后与()结合,表示为一个数组,数组的元素是指向函数的指针。
#include < stdio.h>
#include < Windows.h>
#include < stdlib.h>
void menu()
printf("*****************************\\n");
printf("***1. add2. sub****\\n");
printf("***3. mul4. div****\\n");
printf("***0. exit ****\\n");
printf("*****************************\\n");
printf("Please Enter:");
int add(int x, int y)
return x + y;
int sub(int x, int y)
return x - y;
int mul(int x, int y)
return x * y;
int div_(int x, int y)
if (y == 0)
exit(-1);
return x / y;
int main(void)
int x;
int y;
int input = -1;
int ret = 0;
int (*pfun[5])(int x, int y) =0, add, sub, mul, div_ ;
while (input)
menu();
scanf("%d", & input);
switch (input)
case 0:
printf("ByeBye!\\n");
break;
case 1:
printf("Please Enter Numbers:");
scanf("%d%d", & x, & y);
ret = (*pfun[1])(x, y);
break;
case 2:
printf("Please Enter Numbers:");
scanf("%d%d", & x, & y);
ret = (*pfun[2])(x, y);
break;
case 3:
printf("Please Enter Numbers:");
scanf("%d%d", & x, & y);
ret = (*pfun[3])(x, y);
break;
case 4:
printf("Please Enter Numbers:");
scanf("%d%d", & x, & y);
ret = (*pfun[4])(x, y);
break;
default:
printf("ERROR!\\n");
break;
if (input == 0)
break;
printf("Result -> %d\\n", ret);
system("pause");
return 0;
六.指向函数指针数组的指针
指向函数指针数组的指针是一个指针,指针指向一个数组,数组的元素都是函数指针。
void test(const char* str)
printf("%s\\n", str);
int main(void)
//函数指针pfun
void (*pfun)(const char*) = test;
//函数指针的数组pfunArr
void (*pfunArr[5])(const char* str);
pfunArr[0] = test;
//指向函数指针数组pfunArr的指针ppfunArr
void (*(*ppfunArr)[5])(const char*) = & pfunArr;
return 0;
本节完
推荐阅读
- 图解数据结构排序全面总结(下)
- POP3(基于命令行的电子邮件(EMail)在线查看和批量下载工具)
- 登录令牌JWT一文详解 — JSON WEB TOKEN#yyds干货盘点#
- WebRTC 服务器常见架构
- 3万字聊聊什么是RocketMQ
- JVM | 第2部分(虚拟机执行子系统《深入理解 Java 虚拟机》 #yyds干货盘点#)
- 炒上天的NFT,元宇宙的隐形秩序之钥(他们为什么火)
- 前端新手快速上手APICloud App开发
- kali2021 linux安装后初始化配置