![](https://img-blog.csdnimg.cn/20201014180756923.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
C++学习
C++学习相关总结
雪舞飞影
喜欢钻研Android源码的程序猿
展开
-
sizeof和strlen区别
(1)strlenstrlen()是函数,用于计算字符串数组的实际长度(到‘\0’结束,不包含‘\0’);strlen只能用于计算char *a或char a[]格式的,不能用于计算string类型。char a[10]; //未初始化,长度不确定char b[10]={}; //初始化为’空,NULL;长度为0,char c[10]="abc"; //遇到’\0‘结束,实际长度为3char d[10]="abc\0def"; //遇到’\0‘结束,实际长度为3char *e="ab原创 2021-09-04 15:56:15 · 191 阅读 · 0 评论 -
C++内存管理以及野指针问题
(1)内存主要分为5个存储区栈(Stack):局部变量,函数参数等存储在该区,由编译器自动分配和释放;堆(Heap):需要程序员手动分配和释放(new,delete),属于动态分配方式;全局/静态存储区:全局变量,静态变量分配到该区,到程序结束时自动释放;文字常量区:存放常量,而且不允许修改,程序结束后由系统释放;程序代码区:存放程序的二进制代码;(2)使用存储区的三种方式静态存储区:全局变量,静态变量及静态类成员存储在该区,在编译期间就进行分配,生存期到程序结束。存储在该区的对象只初始原创 2021-09-04 15:54:36 · 240 阅读 · 0 评论 -
结构体基本操作
(1)结构体的定义//结构体定义的四种方式typedef struct Student{ char name[64]; int age;}Student1;struct Student{ char name[64]; int age;};struct Student{ char name[64]; int age ;}s1, s2; //定义类型的同时 定义变量struct { char name[64]; int age;}s3, s4; //匿名类型原创 2021-09-04 15:53:39 · 262 阅读 · 0 评论 -
结构体做函数参数
(1)common codestruct Teacher { char name[64]; char *alisname; int age;};void printTeacher(Teacher *array, int num) { int i = 0; for (i = 0; i < num; i++) { cout << "age = " << array[i].age<< endl; }}void sortTeacer(Teac原创 2021-09-04 15:39:51 · 140 阅读 · 0 评论 -
C++回调函数
(1)函数指针方式通过函数指针进行调用,实现者只需将自己定义的函数作为参数传递给调用者即可。void fun1(int a){ cout << a << endl;}void fun2(int a){ cout << a*a << endl;}void caller(void(*f)(int),int a) //调用者提供接口,具体的实现由客户自己实现{ f(a);}int main(){ in原创 2021-09-02 13:46:24 · 80 阅读 · 0 评论 -
extern“C“的使用
(1)使用缘由经常看到如下代码:#ifdef _cplusplusextern "C" {#endif#include "XXX.h"#ifdef _cplusplus}#endifextern "C"的作用是,告诉C++编译器,下面的代码按照C的方式进行编译,即不要对这些函数进行名字重整,常在C++程序中使用C函数或者模块时,需要用到这个功能。(2)原因C++为了支持函数重载,将编译后的函数名做了重整int add(int a, int b);而C中编译完的名字就是add原创 2021-09-01 19:02:26 · 298 阅读 · 0 评论 -
多维数组的本质
(1)多维数组名本质数组首元素的地址和数组地址是两个不同的概念数组名代表数组首元素的地址,它是个常量数组首元素的地址和数组的地址值相等int main() { int a[3][5], i = 0, j = 0; int tmp = 1; for (i = 0; i < 3; i++) { for (j = 0; j < 5; j++) { a[i][j] = tmp++; } } //a: 6684096 , a+1: 6684116 a+1的步长是20原创 2021-08-24 00:03:23 · 154 阅读 · 0 评论 -
数组指针类型
(1)数组简单入门int main(){ int a[] = {1, 2}; int b[100] = {1, 3}; int c[200] = {0}; memset(c, 0, sizeof(c)); //c是数组首元素的地址:c+1的步长是4个字节 //&c是整个数组的地址:&c+1的步长是200*4 return 0;}(2)定义数组类型类型本质:固定大小内存块的别名int main(){ typedef int (MyArrayType)[5]原创 2021-08-23 23:44:14 · 249 阅读 · 0 评论 -
二级指针做输入的内存模型
(1)指针的输入和输出特性getMem_Free函数形参使用二级指针,可指向实参(传递实参地址:&p1)//指针做输出:被调用函数分配内存 //指针做输入:主调用函数分配内存int getMem(char **myp1, int *mylen1, char **myp2, int *mylen2){ char *tmp1 = NULL; char *tmp2 = NULL; tmp1 = (char *)malloc(100); if (tmp1 == NULL) { r原创 2021-08-23 23:57:15 · 93 阅读 · 0 评论 -
一级指针和二级指针技术推演
(1)1级指针的技术推演int getFileLen(int *p){ *p = 41; //在被调用函数里面通过形参去间接的修改实参的值}int getFileLen2(int b){ int i = 0; b = 100;}//1级指针的技术推演void main(){ int a = 10; int *p = NULL; a = 20; //直接修改 p = &a; //建立关联 *p = 30; //p的值是a的地址 *就像一把钥匙,通过地址原创 2021-08-23 23:39:12 · 239 阅读 · 0 评论 -
C++学习总结3
(1)C预处理,条件编译(A)宏定义与宏替换宏名一般大写,替换发生在编译之前,且是机械替换,不做语法检查,也不分配内存,不占用运行时间,只占用编译时间。1、符号常量的宏定义和宏替换 :#define 标识符 字符串#include<iostream>#define P 3+4using namespace std;void main(){ int a=2; cout<<a*P<<endl; //相当于a*3+4,而不是a*(3+4),机械替换}原创 2021-09-04 15:56:37 · 174 阅读 · 0 评论 -
C++学习总结2
(1)实参的a和形参的a的数据类型本质不一样,形参中的数组编译器会把它当成指针处理,调用函数时需将数组名(内存首地址)和数组的有效长度传给被调用函数。(2)数据类型的本质:固定大小内存块的别名b+1、&b+1 结果不一样:b、&b所代表的数据类型不一样b代表的数组首元素的地址&b代表的是整个数组的地址(3)一般认为:栈开口向下,不管栈开口向上还是向下,buf的内存地址buf+1永远向上的(4)野指针产生的原因:指针变量和它所指向的内存空间变量是两个不同的概念释原创 2021-08-23 23:37:06 · 432 阅读 · 4 评论 -
C++学习总结1
1.字符等输入问题//(1)char ch;cin >> ch;cin.get(ch);ch = cin.get();cout << ch << endl;//(2)string str;getline(cin,str);cout << str << endl;//(3)char name[20];cin.g...原创 2020-07-29 22:14:40 · 250 阅读 · 0 评论