指针的进阶

Posted w一个菜鸟

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了指针的进阶相关的知识,希望对你有一定的参考价值。

一 .字符指针

二.数组指针,指针数组

三.数组传参 指针传参

四.函数指针

五.函数指针数组

六.指向函数指针数组的指针


下面开始本节的内容

一.字符指针

在指针的类型中有一种指针类型的字符指针

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;

指针的进阶_函数指针

指针的进阶_数组_02

因为比较的是地址,所以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;

指针的进阶_数组_03

#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;


指针的进阶_函数指针_04

//指针数组是数组,用来存放指针
#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;

指针的进阶_函数指针_05

数组指针的使用

数组本身的元素类型加元素的个数共同决定数组类型。

数组传参时会降维成指向其内部元素类型的指针,前提是我们认为所有的数组都是一维的。

数组传参时只能省略一维数组的下标(第一个方括号)的值。

三.数组传参,指针传参

数组传参
#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_06


函数指针
#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. add 2. sub ****\\n");
printf("*** 3. mul 4. 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;

本节完





以上是关于指针的进阶的主要内容,如果未能解决你的问题,请参考以下文章

C语言进阶笔记深入了解进阶指针

C语言进阶笔记深入了解进阶指针

C语言进阶笔记深入了解进阶指针

C语言进阶笔记深入了解进阶指针

C语言进阶5——指针的进阶

C语言进阶——指针进阶(字符指针指针数组数组指针)