深入理解指针(3)——C语言
一、字符指针变量
在指针的类型中我们知道有一种指针类型为字符指针char* ;
一般使用:
int main()
{
char ch = 'w';
char *pc = &ch;
*pc = 'h';
return 0;
}
这是一种常规用法,还有另一种:
nt main()
{
const char* pstr = "hello world.";
printf("%s\n", pstr);
return 0;
}
这种用法特别容易让小白误解成是将字符串"hello world."整个放到pstr变量中去了,其实不然,它是将字符串"hello world."中首元素字符"h"的地址放到pstr中去了,因为内存中地址是连续的,顺藤摸瓜就能找到整个字符串。
而且常量字符串是不能被修改的,所以相同的常量字符串在内存中只会存一份~
我们验证一下:
#include <stdio.h>
int main()
{
const char* str1 = "hello world.";
const char* str2 = "hello world.";
if (str1 == str2)
printf("str1 and str2 are same\n");
else printf("str1 and str2 are not same\n");
return 0;
}
事实证明我们的猜想完全正确!
那么,存放在数组中的相同的字符串是否存的是一份呢?我们再来验证一下:
#include <stdio.h>
int main()
{
char str1[] = "hello world.";
char str2[] = "hello world.";
if (str1 == str2)
printf("str1 and str2 are same\n");
else printf("str1 and str2 are not same\n");
return 0;
}
这里我们可以看出,地址是不一样的,也就是说:即使数组中存放的是相同的字符串,计算机也会开辟出不同的内存去储存它们。这点差异大家要记清楚~
二、数组指针变量
1.什么是数组指针变量?
没什么神秘的哈哈哈,数组指针变量就是存放数组地址的指针。
那怎么书写呢?这里要注意写法。
int (*p)[10];
p先和*结合,说明p是一个指针变量变量,然后指着指向的是一个大小为10个整型的数组。
2.数组指针的初始化
数组指针变量是用来存放数组地址的,那怎么获得数组的地址呢?那就是**&数组名**,取出的就是整个数组的地址。
int arr[10] = {0};
&arr;//得到的就是数组的地址
int(*p)[10] = &arr;
简而言之,数组指针就是存放数组地址的指针。
那我弱弱的问一句,数组指针是数组还是指针?废话!数组指针当然是指针啊!
三、函数指针变量
什么是函数指针?答:函数指针就是存放函数地址的指针变量。
我们来演示一下:
#include <stdio.h>
int Add(int x, int y)
{
return x + y;
}
int main()
{
int (*pf)(int, int) = Add;
//int (*pf)(int, int) = &Add; &可写可不写,函数名也是函数的地址
return 0;
}
int (*pf)(int, int)
其中,第一个int 代表函数的返回类型,(int, int) 中的两个int 分别表示函数的两个形参类型,(*pf)就表示它是一个指针。
那我们来举一反三:
void test(int* p, char ch, float f)
{
;
}
存放这个函数的函数指针类型应该怎么写呢?
void (*pf)(int* , char, float) = test;
OK.你是否明白了呢?
四、函数指针数组
前面我们介绍了函数指针,那如果我们想把一组函数指针存起来怎么办呢?这就需要用到函数指针数组了。
注:但这里有一个前提,函数指针数组中存放的函数指针必须是同一类型的。
接下来我们正文开始:
#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(*p[4])(int, int) = { Add, Sub, Mul, Div};
return 0;
}
int(*p[4])(int, int)
函数指针数组的写法很简单,就是在函数指针变量名的后面加上 [数组元素个数]。
比如上面的例子:
函数指针数组中每个函数指针的类型是:
int (*pf)(int, int)
一共有四个元素,只需要在函数指针变量名的后面加上 [数组元素个数]:
int(*p[4])(int, int)
你明白了吗?
那我们再弱弱的问一句:函数指针数组是什么?是函数?是指针?是数组?
不卖关子了,函数指针数组是数组。