const char*和const char[]怎么识别?

#include <iostream>
using namespace std;

template<typename T> class _ischararray_;

template<typename T, int N> class _ischararray_<T[N]>
{
public: static bool _ischararray(){return true;}
};  

template<typename T>  class _ischararray_<T*>
{
public: static bool _ischararray(){return false;}
};

template<class T>  bool isCharArray(const T& x)
{
	return _ischararray_<T>::_ischararray();
}

int _tmain(int argc, _TCHAR* argv[])
{
	const char* s1   = "12345";
	const char  s2[] = "12345";
	isCharArray("12345")?cout<<"char []"<<endl:cout<<"char*"<<endl;  //char []
	isCharArray(s1)?cout<<"char []"<<endl:cout<<"char*"<<endl;  //char *
	isCharArray(s2)?cout<<"char []"<<endl:cout<<"char*"<<endl; //char []

	return 0;
}

或者下面这段我没有看懂的代码,麻烦大牛们帮忙解释一下下面的代码段:

#include <iostream>
using namespace std;

namespace X
{
	template<typename T, unsigned int SIZE>
	bool IsArray (T (&a)[SIZE]) { return true; }

	template<typename T>
	bool IsArray (const T *&p) { return false; }
}

namespace Y
{
	typedef char (&yes)[2];

	template<typename T, unsigned int SIZE>
	yes IsArray (T (&a)[SIZE]);

	template<typename T>
	char IsArray (const T *&p);
}

int _tmain(int argc, _TCHAR* argv[])
{
	char s1[]  = "hello";
	const char *s2   = "hello";
#if 1
	using namespace X;
	if(true == IsArray(s2))
		throw 0;
	if(false == IsArray("12345"))
		throw 0;
	if(false == IsArray(s1))
		throw 0;
#else
	// 编译期间解决该问题
	using namespace Y;
	if(sizeof(IsArray(s2)) == sizeof(yes))
		throw 0;
	if(sizeof(IsArray(s1)) != sizeof(yes))
		throw 0;
#endif

	return 0;
}
时间: 2024-12-20 13:51:24

const char*和const char[]怎么识别?的相关文章

关于char**与const char**

   const char**a; char *b[] = {0}; a = b; 对于上面这段代码,GCC编译器会在"a=b"一句上报告警告,提示不匹配的指针类型. 感觉非常奇怪,非const向const赋值,居然都报错?在网络上搜索相关问题,得到的信息大致如下: 在ANSI C标准中有这么一句话: 什么是合法的赋值形式呢?两个操作数都是指向有限定符或者无限定符的相容的指针,左边指针所指向的类型必须具有右边指针指向类型的全部限定符. 于是,对于语句: char *test1; con

struct-error C2440:无法从“const char [5]”转换为char [20]”

问题描述 error C2440:无法从"const char [5]"转换为char [20]" 我想写一个根据输入即时查询的功能,但是这里报错了, #include<stdio.h> #include<stdlib.h> #include<string.h> #include<conio.h> struct record { char name[20]; char number[20]; }NumberInfo[500];/

编程c语言-c语言指针问题 char *p=&amp;amp;quot;abcdefg&amp;amp;quot;+1; 为什么会报错,const char*无法转换为char*

问题描述 c语言指针问题 char *p="abcdefg"+1: 为什么会报错,const char*无法转换为char* char p="abcdefg"+1: 为什么会报错,const char无法转换为char* 解决方案 abcdefg是const 不能直接加一 解决方案二: 我想我知道了,字符串是const的对象所以指向他的指针也必须用const修饰,但这样又有个问题了char* p="ddd":为什么就可以呢?"ddd&q

char *str 与char str[] 的区别

简述 char *str = "abcd" 先在静态区为"hello"常量分配5Byte,接着在栈里为指针str分配4Byte(32位机器)并指向"abcd"字串的首地址,因此此时str是指向第一个字符'a'的一个指针. char str[ ] = "abcd" 在栈里分配连续的5Byte,内容为'a','b','c','d','\0',并把首地址标记为str,此时str是数组名,同时也是指向数组第一个字符'a'的指针常量.

char str[] 与 char *str的区别详细解析_C 语言

复制代码 代码如下: char* get_str(void)  {      char str[] = {"abcd"};      return str;  } char str[] = {"abcd"};定义了一个局部字符数组,尽管是数组,但它是一个局部变量,返回它的地址肯定是一个已经释放了的空间的地址. 此函数返回的是内部一个局部字符数组str的地址,且函数调用完毕后 此数组被销毁,所以你返回的指针也就指向一块被销毁的内存,这种写法是错误的. 复制代码 代码如

指针-请教一个顶层CONST和底层CONST的问题

问题描述 请教一个顶层CONST和底层CONST的问题 最近在看C++PRIMER这本书,对于书上所说的这个顶层和底层CONST的问题小弟不是很明白 所以特来这里想请教各位一下, CONST INT CI=42; CONST INT *P2=&CI;//允许改变P2的值,这是一个底层CONST 这句话不是很明白, 为什么能改变P2的值呢?P2不是一个指针常量吗?自身的值是不能 改变的呀,P2指向的对象CI的值也是不能改变的呀,所以等号前面是顶层CONST,后面 是底层CONST我 是这么理解的也

c++ operator&amp;amp;lt;&amp;amp;lt;的参数的const与非const的区别

问题描述 c++ operator<<的参数的const与非const的区别 friend ostream& operator<<(ostream& os,mystring& str); friend ostream& operator<<(ostream& os,const mystring& str); 我遇到的问题是用1的写法调用cout<<str1+str2<<endl时会出错.而用2的写法

c++-为什么 const 和非 const 的汇编代码一样,const 的却能保证不被修改呢?

问题描述 为什么 const 和非 const 的汇编代码一样,const 的却能保证不被修改呢? <C++ Primer>第五版,中文版.145 页. const int i = 42;//int i = 42; cout << i << endl; const int *p = &i; *const_cast<int *>(p) = 0; cout << i << endl; const int i = 42; 与 int

int *p,cons int *p,int const *p,int * const p,const int * const p,int const * const p的区别

 加有const关键字的几种情况的辨析 const修饰的代码 含义(特点) 等价性 int *p = &num; 1.       可以读自己 2.       可以通过*p改自己 3.       可以通过p = &data来看别人 权限最大 cons int *p = &num; 1.const放在左边意味着指向的是常量,这个常量不可以修改, 2.p = &data; (地址可以修改) 3.*p = 30;(这个时候是错误的) 这两者等价(应用:查看别人的账户) i