详解char* p及char p[]

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

猜你喜欢

转载自blog.csdn.net/qq_30460949/article/details/89293098