C语言与C++在实际使用中会有些许差别,记录用。
一、全局常变量和局部常变量
1.C语言
全局常变量不可修改。局部常变量不可以直接修改,可以通过指针间接修改。
全局常变量和局部常变量本质都为变量。
const int b = 2;
int main()
{
const int a = 1;
int* p = &a;
printf(" a=%d\n", a);
printf(" *p=%d\n", *p);
printf(" a的地址为%p\n", &a);
printf(" p的地址为%p\n", p);
*p = 2;
printf(" a=%d\n", a);
printf(" *p=%d\n", *p);
printf(" a的地址为%p\n", &a);
printf(" p的地址为%p\n", p);
//两条语句均无法正常执行,报错“表达必须含有常量值”
//int arr[a];
//int arr[b];
return 0;
}
2.C++
全局常变量不可修改。局部常变量不可以直接修改,可以通过强制类型转换+指针实现间接修改,但是局部常变量的值实际上不会改变。
全局常变量和局部常变量本质都为常量。
const int b = 2;
int main()
{
const int a = 1;
int* p = (int*)&a;
cout << "a=" << a << endl;
cout << "*p=" << *p << endl;
cout << p << endl;
cout << &a << endl;
*p = 2;
cout << "a=" << a << endl;
cout << "*p=" << *p << endl;
cout << p << endl;
cout << &a << endl;
int arr[b] = { 0 };
cout << arr[0] << endl << arr[1] << endl;
return 0;
}
3.总结
总结内容中部分为推断,仅供参考。
C语言中的字面常量、标识符常量和枚举常量保存在符号表中,所以不可修改。字面常量中的字符串常量仅作为值使用时不分配内存空间,若对其取地址就会分配一个全局区常量区内存空间,所以不可修改。全局常变量始终存储在全局区常量区内存空间,所以不可修改。局部常变量始终存储在栈区内存空间,所以可以通过指针间接修改。但二者不在符号表中保存,所以本质都为变量。
C++中的字面常量、标识符常量、枚举常量、全局常变量和局部常变量都是保存在符号表中,所以不可修改。字面常量中的字符串常量、全局常变量和局部常变量仅作为值使用时不分配内存空间,若对其取地址则为字符串常量和全局常变量分配一个全局区常量区内存空间,所以不可修改;为局部常变量分配一个栈上的内存空间,所以可以通过指针仅对栈区内存空间的值进行修改,而不影响符号表中的值。全局常变量和局部常变量都在符号表中保存,所以本质都为变量。
也即,在C语言和C++中一旦对可取地址的常量和变量取地址,其在内存上的存储区域分配是相同的,两者之间的区别在于常量和变量的初始保存位置是否位于符号表中。
二、结构体struct
1.C语言
结构体不可为空,至少要有一个成员;封装时只能定义成员变量,不能定义成员函数,成员变量不能初始化,也不能设置成员的权限;在使用struct定义结构体变量时不可省略struct关键字;用结构体定义创建变量时可以初始化。
//报错,显示应输入声明
//struct A {};
struct Person
{
//public:报错,显示未定义标识符
char Nationality[10];// = "中国";报错
//报错,显示此处不允许函数类型
/*void ShowPerson()
{
cout << Nationality << endl;
cout << Car << endl;
cout << Phone << endl;
}*/
//protected:报错,显示未定义标识符
char Car[10];// = "比亚迪";报错
//private:报错,显示未定义标识符
char Phone[10];// = "华为";报错
};
int main()
{
//报错,显示未定义标识符
//Person Chou = { "中国","比亚迪","华为" };
struct Person Chou = { "中国","比亚迪","华为" };
printf("%s\n", Chou.Nationality);
printf("%s\n", Chou.Car);
printf("%s\n", Chou.Phone);
return 0;
}
2.C++
结构体可以为空,但是它和它所创建的对象所占内存大小为1;封装时能定义成员变量和成员函数,成员变量能够初始化,可以设置成员的权限;在使用struct定义结构体变量时可以省略struct关键字;用结构体定义创建变量时不可以初始化。
struct A {};
struct Person
{
public:
string Nationality = "中国";
void ShowPerson()
{
cout << Nationality << endl;
cout << Car << endl;
cout << Phone << endl;
}
protected:
string Car = "比亚迪";
private:
string Phone = "华为";
};
int main()
{
A a;
cout << "C++中空结构体所占的内存大小为:" << sizeof(A) << endl;
cout << "C++中空结构体所创建的对象所占的内存大小为:" << sizeof(a) << endl << endl;
Person Chou;// = { "USA","Tesla","iPhone" };报错,无法整体初始化
Chou.ShowPerson();
return 0;
}