1.字符指针变量中的奇特之处
(1)一般字符指针:
char ch = 't';
char* p1 = &ch;
*p1 = 'w';
printf("%c", ch);
return 0;
(2)特殊使用方法:这里注意使用的是p1而不是&p1,p1指的是‘d’,而&p1是以外的p1的地址
const char* p1 = "daer K";
printf("%s", p1);
这里看是把一整个字符串传给字符指针,实际上是把字符串的首元素的地址传递
(3)常量字符串的用法和字符指针的区别
const char* p1 = "hello";
const char* p2 = "hello";
char p3[] = "str";
char p4[] = "str";
if (p1 == p2)printf("Yes1\n");
else printf("No1\n");
if (p3 == p4)printf("Yes2\n");
else printf("No2\n");
return 0;
原因:因为p1,p2指向的相同,计算机没必要创建两个相同的字符串,所以把他两储存到一起
但char 内的内容也许会改变,两个p3 p4指的空间不一样,所以不同
2.数组指针
定义:本质是指针,表示的是存放的是数组的地址,能够指向指针的变量,用于存放数组的地址
形式:int (*p)[ ];
用法:
int a[10] = { 0 };
int(*p)[10] = &a;
把数组的的地址存放在指针变量内(注意一点:数组指针的数字要和数组的数字一样)
例子:
int a[3] = { 1,2,3 };
int(*p)[3] = &a;
for (int i = 0; i < 3; i++)
{
printf("%d ", (*p)[i]);
}
return 0;
解释:这里(*p)[i]表示a[i]
结果:
3.数组指针表示二维数组传参本质
例子:用数组指针接受数组地址
void douzu(int(*p)[4], int sz, int len)
{
for (int i = 0; i < sz; i++)
{
for (int j = 0; j < len; j++)
{
printf("%d ", *((*p + i)+j));//解释这里(*p)+i表示找到a[i][],*((*p + i)+j)表示找到a[i][j];
}
printf("\n");
}
}
int main()
{
int a[2][4] = { {1,2,3,4},{2,3,4,5} };
douzu(a, sizeof(a) / sizeof(a[0]), 4);
}
结果:
4.函数指针
定义:用于存放函数地址的指针
形式:int (*p)( , );
函数指针的调用:
int Add(int a, int b)
{
return a + b;
}
int main()
{
int a = 3;
int b = 4;
int (*p)(int, int) = &Add;//这里&可写可省略
int r = (*p)(a,b);
printf("%d", r);
}
运行结果:
加解:(*p)接可以理解为Add,(*p)(a,b)就可以认为是Add(a,b),与正常的函数调用一样
5.函数指针数组
定义:与指针数组类似,唯一不同的是数组里存放的是函数的地址
形式:int (*p[])( , );
与函数指针不同的是,加了个[ ],到时候调用的时候用(*p)[ ]即可
代码实现:
int Add(int a, int b)
{
return a + b;
}
int Del(int a, int b)
{
return a - b;
}
int main()
{
int a = 3;
int b = 4;
int (*p[2])(int, int) = { Add,Del};//这里&可写可省略
int r = (*p[0])(a, b);
int h = (*p[1])(a,b);
printf("%d %d", r,h);
}
结果展示:
4.用函数指针数组实现转移表
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
void menu()
{
printf("********************************\n");
printf("********************************\n");
printf("*******请输入数字: ******\n");
printf("******1.加法 2.减法*************\n");
printf("******3.乘法 4.除法*************\n");
printf("********************************\n");
printf("********************************\n");
}
int Add(int a, int b)
{
return a + b;
}
int Dele(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 ((*p[5])(int,int) )= {0, Add,Dele,Mul,Div };
menu();
do {
int n = 0;
printf("请输入数字:");
scanf("%d", &n);
int a = 0;
int b = 0;
printf("请输入两个整数:");
scanf("%d%d", &a, &b);
if (n >= 1 && n <= 4) {
int r = (*p[n])(a, b);
printf("%d\n", r);
}
else if (n == 0)
{
printf("退出计算器\n");
break;
}
else
{
printf("输入错误,请重新输入\n");
}
} while (1);
return 0;
}