1、 “->” 是和指针连用的 也就是“->”前面是一个内存地址 比如this指针
用于结构体取出结构体中的数据和取类中数据
class student
{
public:
string name[20];
}
student *xy;//访问时需要写成 *xy.name="hhhhh";等价于 xy->name="hhhhh"。
student xy;//访问时需要写成 xy.name="hhhhh"
2、“[ ]”表示取地址中的值 “[ ]”中可以+数字来偏移
int a[10];
a[0]=1;//a表示首地址 [0]表示不偏移 也就是取首地址的值
a[1]=2;//a偏移 1*sizeof(int) 也就到了a[1]的地址
3、
字符数组中为什么能用变量名输出其余全部字符
char a[] = "1234567";
cout<<a<<" "<<a+1<<endl;
因为 char 型数组中的每一个元素都是一字节,所以每一个字符之间的地址都是 +1 的是连续的,所以当 cout 输出时读到字符数组中的 \0 便停止输出; 而有时候由于编译器多分配空间的原因导致出现乱码。当分割一个字符串变成两个时候 需要给第一个后面加上\0
4、类模板一般将类的声明与定义放在一个文件中 并且取名为.hpp 如果不在同一个文件 主函数文件中应该调用类的cpp文件 调用h文件将出错 类模板根据调用的T不同 在使用时内部生成多个类 一样的T共用同一个类 所以一样的T共用同一个static变量 不同的T则不共用
5、int* p [2];
是定义了搁指针数组 p[0] p[1]
int (*p)[2];
则可看成开两个int大小的空间 让p指向这整个空间
6、右值引用&& 也可以const &
int fun(int &&a) 或者 int fun(const &a)都能传参为常量如 fun(2)
传引用比传值快 也就是上面两个写法比 fun(int a)快
7、指针修改const变量
#include <iostream>
int main()
{
const volatile int a=10; //volatile 禁止编译器优化
int *P=(int*)&a;
*P=12;
std::cout<<a;
return 0;
}
输出 12
8、
char arr1[5]={'a','b','c','d','e'}; //长度5
char arr2[6]={"abcde"}; //以\0结尾 长度6
//arr[0]='A'; 报错因为arr2指向的是一个常量区
char arr3[]={'a','b','c','d','e'}; //长度5
char arr4[]="abcde"; //以\0结尾 长度6
const char *arr5="abcde"; /* 这玩意查了下没办法获取他的长度
猜测应该也是6吧(arr5是指针 sizeof()只能得到指针大小4)*/
printf("arr1:%d arr2:%d arr3:%d arr4:%d arr5:%d",
sizeof(arr1),sizeof(arr2),sizeof(arr3),sizeof(arr4));
9、
string str = "abc";
cout << (int*)str.c_str() << endl;
char& addr0 = str[0];
str = "pppppppppppppppppppppppppppppppppp";
cout<<addr0<<endl;
cout << (int*)str.c_str() << endl;
//addr0 = 'A';
cout << str;
输出
原因
在重新赋值时候给str2的字符串重新分配了空间 并释放了str1的空间 导致addr0指向了以前的字符串处于的空间即无效地址 (vs2019中测试 devc或其他版本可能不一样)
提醒:vector类似