C和C++基础语法复习

记录一下复习过程中记录的点

  • C中为什么要给指针加类型
  • 野指针与悬空指针
  • 字符串
  • C中指针传递
  • 深拷贝
  • 全部变量
  • 指针常量和常量指针
  • 友元类
  • C赋值为什么要传递二级指针

C中为什么要给指针加类型

本身无论是什么类型的指针,指针在内存里是占据4个字节大小的内存。
int * 类型的指针数据每一个是四个字节大小,
double * 类型的指针数据每一个是8个字节大小,
知道了指针的类型之后在内存地址连续的时候就可以知道一次挪动多少个字节到下一个元素。

野指针与悬空指针

野指针:int * p 就是野指针,指针类型必须给它指向一个地址,要不然就是随机指向系统的某个地址,叫做野指针,初始化应该指向NULL区。

悬空指针:指针指向的内存地址已经释放了,但是指针还是指向那块地址,应该赋值指向NULL

字符串

char str[] = {‘a’,‘b’};
使用printf(“%s\n, str”); 打印除了ab之外还可能会打印其它的值,因为printf打印遇到\0才会停下来
\0 占据一个字符,它是ASCII码中的第一个字符,代表结束的意思。
而\0虽然不计入str的串长里面,但是它也会占据内存空间,这点在开发中申请堆内存的时候要注意。

而另外一种:char * str2 = “ab”,它会隐式的自动加入\0,直接打印不会有乱码,输出ab。
str2[1] = “a”,不能修改,如果是上面那一种写法则可以修改,为什么?

第一种写法: char str [] = {‘a’,‘b’} : 会在全局区中创建ab字符串内存,而我们这段代码会在栈内存方法中创建一个str数组,并从全局区域ab那里复制一份数据到栈内存中,所以我们可以修改,修改的是栈中的ab数据。

而char * str2 = “ab”, 这是一个指针类型的数据,指向全局区字符串中的内存地址,不能修改。字符串是常量设计

while(*str2) {
// *str2 != ‘\0’ 就一直循环的意思,跟我们说的非零既true不一样,字符串这里是有点特殊。
}

C中指针传递

C/C++ 编译器,数组作为参数传递,会把数组优化成指针,提高效率。

处理过程中对指针的操作必须创建临时变量,不要去挪动原来数据的指针,避免破坏数据。例如:
void lower(char * dest, char * name){
char * temp = name; // 后面处理的name指针挪动就以临时变量temp指针来代替。
}

连续的内存地址指针进行加减才有意义,在数组中获取当前元素在指针的位置可以通过加减指针来得到。
c++ 没有什么强软弱虚,方法区内定义的变量运行完之后就被回收了,即使这个时候有某个指针指向他,如果想要继续持有,必须在堆开辟内存或者使用类似copy函数strcpy将数据复制给外面定义的变量,一般不用malloc。

结构体对成员变量的操作是 xxx.name 而结构体指针是xxx->name

深拷贝

默认的拷贝构造函数是浅拷贝,当对象的成员中有堆成员的话,我们有义务进行重写拷贝构造函数,
避免出现二次释放,当操作对象例如:Student stu1; Student tu2 = stu1;触发拷贝构造函数,
这个时候是有两个对象指针,指向同一个堆内存的stu1,当方法弹栈,导致两个对象触发析构函数,重复释放会崩溃。
所以这个时候就需要深拷贝,在拷贝构造函数里面进行malloc创建堆内存,
每一个对象中有堆成员的都拥有一份,避免出现重复释放导致崩溃。

全部变量

对象里面的int age = NULL;如果不给默认值,会有系统值。类似java,但是值是系统值。

指针常量和常量指针

指针常量:当我们在对象的方法里面修改例如上面的值age, this->age = 100;
this代表一级指针,指向当前对象,类型 * const this,它其实是这样修饰的。
根据我们对指针常量的理解,它不能这样修改:this = 0x345354;
地址不能修改,但是地址所对应的值是能修改的,结果也是这样的。
如果是常量指针就可以修改了,刚好反过来。
const 类型 * const this :常量指针常量,只能读,不能改。
在源码中会出现在函数尾巴例如:void showPig() const;常量指针常量

友元类

在java中每一个类对象都有会有一个Class,此Class可以操作所有类对象的私有成员。
在C++中,只要当前类型里面加入friend class Class;// 友元类,那么class就可以操作当前类了。

C赋值为什么要传递二级指针

C中没有像C++那样的函数&指针传递,C中函数即使传递的是指针函数也会为每个参数制作临时副本,也就是要修改参数的值必须修改当前参数所对应的内容,而我们在C中一般都是操作指针,
也就是说要取当前指针的值,*P,如果传递过来的是二级指针,操作起来就不一样了,具体自己多些代码肯定能体会的。
二级指针的最终目的就是为了给你的一级指针赋值。

你可能感兴趣的:(c++,c语言)