一.用字符数组表示字符串需要注意的问题
1.若用双引号表示字符串,其末尾隐藏一个字符串结束符 '\0':`#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(){
char s1[10]={'a','b','c'};
char s2[10]={'a','b','c','\0'};
char s3[10]="abc";
char s4[10]="abc\0";
char s5[]="abc";
char s6[]="abc\0";
char s7[3]={'a','b','c'};
char s8[]={'a','b','c','\0'};
int l1,l2,l3,l4,l5,l6,l7,l8;
int si1,si2,si3,si4,si5,si6,si7,si8;
l1=strlen(s1);//3
l2=strlen(s2);//3
l3=strlen(s3);//3
l4=strlen(s4);//3
l5=strlen(s5);//3
l6=strlen(s3);//3
l7=strlen(s4);//3
l8=strlen(s5);//3
si1=sizeof(s1);//10
si2=sizeof(s2);//10
si3=sizeof(s3);//10
si4=sizeof(s4);//10
si5=sizeof(s5);//4
si6=sizeof(s6);//5
si7=sizeof(s7);//3
si8=sizeof(s8);//4
printf("%d,%d,%d,%d,%d,%d,%d,%d\n",l1,l2,l3,l4,l5,l6,l7,l8);
printf("%d,%d,%d,%d,%d,%d,%d,%d\n",si1,si2,si3,si4,si5,si6,si7,si8);
return 0;
}`
二.引用
1.引用的概念:
(1)引用仅是变量的别名,而不是实实在在地定义了一个变量,因此引用本身并不占用内存,而是和目标变量共同指向目标变量的内存地址,即共用内存
(2)引用和目标变量的地址是一样的,对引用的操作与对变量直接操作完全一样,即对引用的修改就是对目标变量的修改
(3)表达式中的取地址符&不再是取变量的地址,而是用来表示该变量是引用类型的变量。
(4)定义一个引用时,必须对其初始化,即 引用了谁
(5)使用一般变量传递函数的参数,即值传递,当发生函数调用时,需要给形参分配存储单元,形参变量是实参变量的副本;如果传递的是对象,还将调用拷贝构造函数
(6)使用指针作为函数的参数在被调函数中同样要给形参分配存储单元,调用时必须用变量的地址作为实参
(7)使用引用传递函数的参数,在内存中并没有产生实参的副本
int main()
{
int intOne;
int &rSomeRef = intOne;
intOne = 5;
cout << "intOne:" << intOne << endl;//5
cout << "rSomeRef:" << rSomeRef << endl;//5
int intTwo = 8;
rSomeRef = intTwo;
cout << "nintOne:" << intOne << endl;//8
cout << "intTwo:" << intTwo << endl;//8
cout << "rSomeRef:" << rSomeRef << endl;//8
return 0;
}
二.引用和指针的异同
1.不同点
①从现象上看,指针在运行时可改变其所指向的值,而引用一旦和某个对象绑定后就不再改变。这句话可以这样理解:指针可以被重新赋值以指向另一个不同的对象,但是引用总指向在初始化时被指定的对象,以后不能改变,但是指定的对象内容可以改变。
②从内存上分配看,程序为指针变量分配