c語言中,字符串常量、字符數組、字符串指針三者作爲函數參數時,到了函數內部都會變成字符串指針(char*),原因是傳入函數的都是它們的首地址。
測試代碼如下:
#include<stdio.h>
#include<typeinfo>
void print_type1(const char str_arg[])
{
if(typeid(str_arg)==typeid(char*))
printf("type is char*");
if(typeid(str_arg)==typeid(char[]))
printf("type is char[]");
if(typeid(str_arg)==typeid(const char*))
printf("type is const char*");
if(typeid(str_arg)==typeid(const char[]))
printf("type is const char[]");
}
void print_type2(const char* str_arg)
{
. if(typeid(str_arg)==typeid(char*))
printf("type is char*");
if(typeid(str_arg)==typeid(char[]))
printf("type is char[]");
if(typeid(str_arg)==typeid(const char*))
printf("type is const char*");
if(typeid(str_arg)==typeid(const char[]))
printf("type is const char[]");
}
void print_type3(char str_arg[])
{
if(typeid(str_arg)==typeid(char*))
printf("type is char*");
if(typeid(str_arg)==typeid(char[]))
printf("type is char[]");
if(typeid(str_arg)==typeid(const char*))
printf("type is const char*");
if(typeid(str_arg)==typeid(const char[]))
printf("type is const char[]");
}
void print_type4(char* str_arg)
{
if(typeid(str_arg)==typeid(char*))
printf("type is char*");
if(typeid(str_arg)==typeid(char[]))
printf("type is char[]");
if(typeid(str_arg)==typeid(const char*))
printf("type is const char*");
if(typeid(str_arg)==typeid(const char[]))
printf("type is const char[]");
}
int main()
{
char c[]="abc";
char* p=c;
print_type1(c);
print_type1("ab");
print_type1(p);
print_type2(c);
print_type2("ab");
print_type2(p);
print_type3(c);
print_type3("ab"); //新版c標準不允許這種寫法--const轉化爲非const,舊版只會報warning
print_type3(p);
print_type4(c);
print_type4("ab"); //同上
print_type4(p);
return 0;
}
結果爲print_type1和print_type2的輸出爲:type is const char*;而print_type3和print_type4的輸出爲:type is char*。
這也說明了,形參帶const與否會影響函數內部的字符串參數類型,否則,即當形參無const聲明時,字符串參數在函數內部的類型不受形參聲明的影響。