从定义来看就像标题一样
为什么打引号,其实实际使用中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 = #
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;
}