C++学习第十天----指针

1.指针、数组和指针运算

        指针和数组基本等价的原因在于指针算术和c++内部处理数组的方式;

        c++将数组名解释为地址;

下面是一个示例代码:

指针,数组和指针运算,程序清单4.19 · c8904bf · Kite/C和C++ - Gitee.com

   多数情况下,c++将数组名解释为数组第1个元素的地址;     

将指针变量加1后,其增加的值等于指向的类型占用的字节数;

从上面代码的输出可以看出,*(stacks +1)好stack[1]是等价的;

通常使用数组表示法时,c++都将执行下面的转换:

arrayname[i]  becomes *(arrayname + 1)

如果使用的是指针,而不是数组名,则c++也将执行同样的转换:

pointername[i] becomes *(pointername + i )

        因此,在很多情况下,可以相同的方式使用指针名和数组名。对于它们,可以使用数组方括号表示法,也可以使用解除引用运算符(*)。在多数表达式中,它们都表示地址。区别之一是,可以修改指针的值,而数组名是常量

pointername = pointername + 1;//这是没问题的

arrayname = arrayname + 1;//这是不允许的;

另一个区别是,对数组运用sizeof运算符得到的是数组的长度,对指针得到的是指针的长度;这种情况下,c++不会将数组名解释为地址;

2.数组的地址

        数组名被解释为其第1个元素的地址,而对数组名应用地址运算符时,得到的是整个数组的地址;

shaort tell[10];
cout << tell << endl;
cout << &tell << endl;

        上面的打印结果,从数字上说,两个地址相同;但从概念上说,&tell[0]是一个2字节内存块的地址,而&tell是一个20字节内存块的地址;因此,表达式tell +1将地址值加2,而表达式&tell + 1将地址加20;

        short (*pas)[20] = &tell;

上面这句代码可以了解一下;

3.指针和字符串

        数组名是第一个元素的地址;cout对象认为char的地址是字符串的地址,因此它打印该地址处的字符,直到遇到空字符为止;

char doub[10] = “rose”;
cout << doub << "s are red\n";

在c++中,用引号括起的字符串像数组名一样,也是第一个元素的地址;

指针和字符串;程序清单4.20; · a0ec980 · Kite/C和C++ - Gitee.com

        字符串字面值是常量,这就是为什么代码在声明中使用关键字const的原因。以这种方式使用const意味着可以用bird来访问字符串,但不能修改它;

    指针ps未被初始化,因此不指向任何字符串(禁止,别问为什么);    

    如果非要用,可能会出现空行,乱码,程序崩溃;

你可能感兴趣的:(c++,学习,jvm)