C++中字符数组char c[],“指向字符型的指针”char* p,“指向字符型的指针数组”char* p[]

从定义来看就像标题一样

为什么打引号,其实实际使用中c++编译器把char* 当成c语言字符串,

char ch[]="word";
char* p=ch;

p解析后得到是字符串首字符‘w’,p指向数组地址,而数组名是数组首元素的地址

std::cout << *p << std::endl;//输出w
std::cout << p << std::endl;//输出字符串

 

下面这段当p赋值为字符的地址时:

char ch=‘s’;
char* p=&ch;

std::cout << *p << std::endl;//输出s
std::cout << p << std::endl;//有时候会输出乱码,因为编译器把char*当成数组,会从字符开始输出直至遇到一个空字符

 

而编译器直接把char* p[]当成字符串数组:

char c[10] = "hello";//字符数组,也即是C风格字符串
char ca[] = "hello world";
char ch[]="word";

char* p=ch;//这里表明char* 其实是字符数组

char* pc[] = {c,ca,p};//正确赋值,数组名也是指针(指向数组首元素)

std::cout << pc[0]<< std::endl;//打印的是字符串
std::cout << pc[1] << std::endl;
std::cout << pc[2] << std::endl;

 

测试代码:

#include<iostream>
#include <stdio.h>

int main() {
	int num = 10;
	int *p1;
	p1 = &num;

	std::cout  << "整型与指针数组-----------" << std::endl;
	int p11[] = {1,2};//int型数组,数组名也是一个指针
	int* pi[] = {p1,p11,p11+1};//int型指针的数组
	std::cout << pi << std::endl;
	std::cout << pi[0] << std::endl;//输出的是地址
	std::cout << pi[1] << std::endl;
	std::cout << pi[2] << std::endl;
	std::cout << *pi[0] << std::endl;//解析输出数字10、1、2
	std::cout << *pi[1] << std::endl;
	std::cout << *pi[2] << std::endl;


	std::cout << std::endl;
	std::cout << "字符数组与char* p,char *p[]-----------" << std::endl;
	char c[10] = "hello";//字符数组,也即是C风格字符串
	char ca[] = "hello world";
	char ch[]="word";
	char* p=ch;//这里表明char* 其实是字符数组
	std::cout << *p << std::endl;//输出w
	std::cout << p << std::endl;//输出字符串

	//char*字面似乎是指向char型的指针
	//但实际使用时应该是指向字符串首字符的指针,与数组名定义一样
	//所以char* pc[]应该为字符串数组,即每个元素都是一个字符串
	//char* pc[] = "hello";//错误
	char* pc[] = {c,ca,p};//正确

	std::cout << c << std::endl;//直接打印字符串
	std::cout << ca << std::endl;
	std::cout << pc << std::endl;//数组名,指向数组首元素,输出地址
	std::cout << pc[0]<< std::endl;//数组元素其实是char*,也是字符数组、字符串,所以打印的是字符串
								   //这点与上面整型指针数组不一样,整型指针数组每个元素打印的是地址
	std::cout << pc[1] << std::endl;
	std::cout << pc[2] << std::endl;

	char ch1 = 'a';
	char ch2 = 'a';
	char ch3 = 'a';
	//char* pch[] = {ch1,ch2,ch3};//因为char* pc[]应该为字符串数组,即每个元素都是一个字符串,所以这样赋值错误


	std::cout << "char *与char str[]---------"<<std::endl;
	char c0 = 'a';
	char c1 = 'b';
	char* pc1;
	pc1 = &c1;
	std::cout << pc1 << std::endl;//本应该输出字符地址,但是乱码,或者说输出的是字符串
	std::cout << (void*)pc1 << std::endl;//正确输出字符地址
	std::cout << *pc1 << std::endl;

	char* pc2 = &c0;
	std::cout << pc2 << std::endl;
	std::cout << *pc2 << std::endl;

	char str[] = "sssq";
	char* pc3 = str;
	std::cout << pc3 << std::endl;//char* 输出了完整字符串
	std::cout << *pc3 << std::endl;//解析只能输出字符串首字符,印证char* 其实是字符数组

	std::cout << std::endl;
	std::cout << "整型、字符与地址-----------"<< std::endl;
	//这些数据在内存中不会按照顺序分配地址,有可能char地址类型会在int之前
	//生成-配置管理器-活动解决方案配置
	//Debug模式下连续的int型间隔12字节,改为release模式则正常为4字节
	int n = 10;
	int n1 = 10;
	int n2 = 10;
	char c2 = 'a';
	char c3 = 'b';
	int n3 = 10;

	std::cout << &n << std::endl;
	std::cout << &n1 << std::endl;
	std::cout << &n2 << std::endl;

	std::cout << "C++打印字符地址-----------" << std::endl;
	std::cout << &c2 << std::endl;//c++编译器会当成字符串,输出字符直到空字符,不是release模式会乱码(Debug),生成-配置管理器-活动解决方案配置
	std::cout << &c3 << std::endl;

	std::cout << (void*)&c2 << std::endl;//正确输出字符地址
	std::cout << (void*)&c3 << std::endl;
	std::cout << &n3 << std::endl;

	std::cout << sizeof(n) << std::endl;
	std::cout << sizeof(n1) << std::endl;
	std::cout << sizeof(n2) << std::endl;
	std::cout << sizeof(c2) << std::endl;
	std::cout << sizeof(c3) << std::endl;

	//char* p =  "abc" ;//c++ 11之后错误

	printf("%p\n", &c2);//c语言版输出字符地址

	return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值