#include <stdio.h>
#include <string.h>
#include<string>
#include<iostream>
using namespace std;
void fun(char c[])
{
printf("%d\n" , sizeof(c)); //数组名作为函数形参时,在函数体内,其失去了本身的内涵,仅仅只是一个指针;所以这里大小为4字节
cout<<*((c++))<<endl; //沦落普通指针的数组名,失去常量特性,可以作自增、自减等操作,可以被修改。
cout<<strlen(c)<<endl; //也是得到正常的字符串数组长度
cout<<c[2]<<endl; //也是可以当一个正常数组查询组内成员
}
void fun2( char &c) //这里&是引用
{
c=65; //修改引用常量
printf("%d\n" , sizeof(c)); //既然输入的是字符常量,当然值为1字节
//cout<<strlen((const char *)c)<<endl; //崩溃
//cout<<c[2]<<endl; //崩溃
}
void fun3(char(&c)[9]) //这里&作用为取地址符,(&c)[9]得到原数组,c还是数组名,且保留常量特性,不是一般的指针
{
printf("%d\n" , sizeof(c)); //长度依旧为9
//cout<<*((c++))<<endl; //c不可修改,保留数组名的常量特性
cout<<strlen(c)<<endl; //字符串长度
cout<<c[2]<<endl; //也是可以当一个正常数组查询组内成员
}
int main()
{
char c[] = "12345678";
double a=2.4;
double *p= &a; //什么类型的指针都是占用四个字节
string s="12345678";
printf("%d\n%d\n%d\n%d\n%d\n" , sizeof(c),sizeof(s),strlen(c),s.length(),sizeof(p));
if(s[8]=='\0')
cout<<"yes"<<endl;
/*
1、数组名sizeof 得到的结果是数组长度+1,因为后面加上‘\0’;
2、string类型在vs2012中占用28个字节,在g++等一般编译器中占用4个字节
3、strlen()得到的就是真正的字符串长度,当然是没算上结束符‘\0’的;
4、s.length()得到的是真正的string字符串长度;
5、什么类型的指针都是占用四个字节,不论是int还是double抑或是什么东东。
6、全局的std::getline返回std::string,这个不一定是'\0'结尾。有的编译器会加,有的编译器不会加。
但是,注意:新的C++标准C++11里面规定std::string一定是以'\0'结尾,就看你的编译器有没有实现新标准了。
istream::getline返回c字符数组,这个一定是'\0'结尾。
g++以及vs2012得到的string类型后面都是‘\0’结尾。
*/
cout<<*c<<endl; //可以知道*c==c[0]
//做几个小实验
fun(c); //这里把数组名当实参
fun2(*c); //实参为*c,即为c[0]
cout<<*c<<endl; //可以知道fun2 内修改了c[0]值,为引用特性
fun3(c); //这里把数组名当实参,不过fun3 与fun有所不同
return 0;
#include <string.h>
#include<string>
#include<iostream>
using namespace std;
void fun(char c[])
{
printf("%d\n" , sizeof(c)); //数组名作为函数形参时,在函数体内,其失去了本身的内涵,仅仅只是一个指针;所以这里大小为4字节
cout<<*((c++))<<endl; //沦落普通指针的数组名,失去常量特性,可以作自增、自减等操作,可以被修改。
cout<<strlen(c)<<endl; //也是得到正常的字符串数组长度
cout<<c[2]<<endl; //也是可以当一个正常数组查询组内成员
}
void fun2( char &c) //这里&是引用
{
c=65; //修改引用常量
printf("%d\n" , sizeof(c)); //既然输入的是字符常量,当然值为1字节
//cout<<strlen((const char *)c)<<endl; //崩溃
//cout<<c[2]<<endl; //崩溃
}
void fun3(char(&c)[9]) //这里&作用为取地址符,(&c)[9]得到原数组,c还是数组名,且保留常量特性,不是一般的指针
{
printf("%d\n" , sizeof(c)); //长度依旧为9
//cout<<*((c++))<<endl; //c不可修改,保留数组名的常量特性
cout<<strlen(c)<<endl; //字符串长度
cout<<c[2]<<endl; //也是可以当一个正常数组查询组内成员
}
int main()
{
char c[] = "12345678";
double a=2.4;
double *p= &a; //什么类型的指针都是占用四个字节
string s="12345678";
printf("%d\n%d\n%d\n%d\n%d\n" , sizeof(c),sizeof(s),strlen(c),s.length(),sizeof(p));
if(s[8]=='\0')
cout<<"yes"<<endl;
/*
1、数组名sizeof 得到的结果是数组长度+1,因为后面加上‘\0’;
2、string类型在vs2012中占用28个字节,在g++等一般编译器中占用4个字节
3、strlen()得到的就是真正的字符串长度,当然是没算上结束符‘\0’的;
4、s.length()得到的是真正的string字符串长度;
5、什么类型的指针都是占用四个字节,不论是int还是double抑或是什么东东。
6、全局的std::getline返回std::string,这个不一定是'\0'结尾。有的编译器会加,有的编译器不会加。
但是,注意:新的C++标准C++11里面规定std::string一定是以'\0'结尾,就看你的编译器有没有实现新标准了。
istream::getline返回c字符数组,这个一定是'\0'结尾。
g++以及vs2012得到的string类型后面都是‘\0’结尾。
*/
cout<<*c<<endl; //可以知道*c==c[0]
//做几个小实验
fun(c); //这里把数组名当实参
fun2(*c); //实参为*c,即为c[0]
cout<<*c<<endl; //可以知道fun2 内修改了c[0]值,为引用特性
fun3(c); //这里把数组名当实参,不过fun3 与fun有所不同
return 0;
}
结果为:
9
28
8
8
4
yes
1
4
1
7
4
1
A
9
8
3