1、字符数组和字符串指针
数组名很像指针,但不是指针!
int main()
{
//C风格的字符
char ca1[] = {'a','b','c'};//后面不会跟'\0'
char ca2[] = {'a','b','c','\0'};//需要显示的加上
char ca3[] = "abc";//编译时自动加上'\0'
//字符指针和字符数组
/*
"hello"是一个字符常量,在静态常量区(不能修改其值),str是一个指针变量,
这时候指向"hello"常量区的地址
*/
char *str = "hello";
/*
"hello"在栈中,可以修改其值,arr是这段内存的地址,arr指向"hello",
但是只能看成是指针常量
(http://tech.163.com/05/0823/11/1RR94CAS00091589.html)
*/
char arr[6] = "hello";
//str[0] = 'm'; //运行时出现错误,不能修改
arr[0] = 'm'; //可以修改
//arr++; //编译不过
str++; //地址+1 ->"ello"
str = arr; //指针变量str重新指向arr这个地址
cout<<str<<endl;
/*
arr指代了这个数组,所以sizeof(arr) 是6
*/
cout<<sizeof(str)<<":"<<sizeof(arr)<<endl;
return 0;
}
2、指针和引用
第一个区别:
引用总是指向某个对象:定义引用时没有初始化是错误的;
第二个区别:
给引用赋值是修改的 该引用关联的对象的值!引用一经初始化,就始终指向同一个特定的对象。
而指针是一个变量!
//指针和引用的区别
int x = 101,y = 202;
int &a = x; //定义引用时初始化
int *b = &x;
a = y; //修改了x的值,因为a和x关联了
b = &y; //将b指向了y
cout<<a<<*b<<endl;
cout<<x<<endl;
3、指针和多维数组