char* p():声明一个函数返回值为一个指向字符(串)的指针。
#include <iostream>
using namespace std;
char* p()
{
static char str[100] = { "Hello World!!" };
return str;
}
void main()
{
char* str = nullptr;
str = p();
cout << "str: " << str << endl;
}
char* (*p)():定义一个函数指针,所指向函数返回值为字符指针。
#include <iostream>
using namespace std;
char* p()
{
static char str[100] = { "Hello World!!" };
return str;
}
void main()
{
char* (*p0)();
p0 = p;
}
char*p[]:首先是一个数组,每个元素为一个指向字符(串)的指针。
例如char* p[3] = { "111", "222", "333"}:“[“ 的优先级高于 ”*” 意味着p是一个有3个元素的数组元素的类型是 char*。或者可以理解将p和[3]在一起,则p[3]是个数组,p存放的是数组中首个元素的地址,数组里存放的 char*类型的数据,char* 类型即是指针类型,也就是里面是指针,即:某个变量的地址。
#include <iostream>
using namespace std;
void main()
{
char* p[] = { "111", "222", "333" };
for (auto i = 0; i < sizeof(p)/sizeof(*p); ++i)
{
cout << "p: " << p[i] << endl;
}
}
char (*p)[]:是一个指针,指向一个字符数组。
例如char (*p)[10]:“(“的优先级最高, 意味着p是一个指针,指向一个有10个char元素的数组。或者可以将 (*p)看成一个整体,然后(*p)存放的是char[3]数组中首个元素的地址,p存放的是(*p)的地址,即:数组的地址。
#include <iostream>
using namespace std;
void main()
{
char (*p)[10] = { 0 };
char s[3][10] = { "111", "222", "333" };
p = s;
for (auto i = 0; i < sizeof(s)/ sizeof(*s); ++i)
{
cout << "p[" << i << "]: " << p[i] << endl;
}
}
char* p和char p[]赋值时的区别
1、看这个赋值语句char *s="abc":
右边,是"abc",是个字符串常量,存在于内存某处,字符串常量所在内存是只读的。
左边,字符指针s,赋值的时候,把地址偏移到"abc"所在的地址,存放到指针变量s中。程序员能控制的内存是该指针变量所指向的这四个字节内存,仅能改变该指针的指向,至于其指向的内存能不能写,那就看程序了,本程序是指向的是一块只读内存,不能写,因此写会出错。
2、再看这个赋值char p[]="abccd"语句:
右边,和上面类似,是"abccd",也是个字符串常量,存在于内存某处,编译器分配的(赋值之后,程序员不知道这个常量存在何处,由于没有用指针指向这块内存,这和上面不同)。该字符串常量所在内存也是只读的。
左边,字符数组p,赋值的时候,把地址所指内存中的内容,复制到从字符数组p开始指向的内存中,每复制一个字符都会开辟一个字节(char型变量占1字节)内存来存放这个字符(这也是实现了数组元素个数的动态存储)。程序员可以完全控制从字符数组p开始的这部分到复制结束存放这些字符的内存,可读可写,因此在这些内存写不会出错。
参考:
https://blog.csdn.net/fangwk/article/details/53186541
https://blog.csdn.net/u012247980/article/details/79988745
https://blog.csdn.net/u014694994/article/details/79103590
https://zhidao.baidu.com/question/1963991196783708060.html