C/C++小结

本文深入探讨了C与C++编程的关键概念和技术,包括数组、指针、函数调用、字符串操作、类型转换、内存管理、结构体、枚举、函数指针、回调函数、共用体、二级指针、类的构造与析构、面向对象特性等,提供了丰富的代码实例和解释。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

全局变量加static不能被其他文件调用,只能本文件私有。

数组元素个数sizeof(array)/sizeof(array[0])。

冒泡排序:每次内循环冒出最大/最小的数;选择排序:每次内循环找到最小值位置,然后交换。

函数调用中,sizeof(形参)答案一直为4,形参只是指针地址,4个字节。

指针强制转化:int *p=a;char *pc=(char*)p;将p强制转化为char型,pc只能取一个字节,p能取四个字节。

getchar();使用之前清理内存用fflush(stdin)。

scanf(“%s")不能接收空格,gets(s)可以接收空格。

strcopy(a,b)将b复制给a,b必须有结束符;strcat(a,b)将b添加到a上,a,b必须有结束符,字符串加长函数;strtok(s,"  ")拆分字符串,截断字符串。

类型转化函数:sprintf()数字转换为字符串;atoi()将字符串转换为数字。

指针表示数组元素:纯指针法:*p,循环时用++p;纯下标法:p[i]循环时用++i;半指针法:*(p+i)循环时用++i;纯下标法与半指针法使用时,指针指向的地址一直没变。p[i]等价于*p(i)。

双引号之间的内容都指向常亮区,*p="abcd";  p[0]='a'; 崩溃。

数组使用{}大括号清零时只能在定义时使用。

头文件中:不可以放变量的定义;不可以放全局函数变量的定义,可以放全局函数和全局变量的声明;可以放结构体体定义。

void *  函数必须返回一个地址。

指针p指向一个地址,*p则为指向东西的数值,为所指向东西的代名词,相当于别名。

函数中,输出型参数必须使用指针变量,不然改变不了实际参数数值,

C语言中,memset(&s,0,sizeof(s)),对s字符串内存用0填充,#include<memory.h>。

memcpy(&i,&j,sizeof(int)));将 j 复制给 i 。

指针变量指向结构体时,调用变量(*p).xxx用   简化。

结构体做参数时,建议用指针。

局部变量结构体不初始化时,缺省为cccc;初始化清零时 ,用大括号sstruct ={ 0 };用memset(&s,0,sizeof(s));清零;全局定义结构体时,不初始化缺省为0。

结构体中数组变量初始化赋值用strcpy         #include<string.h>

输出型函数必须用指针*p做形参。

system("cls");清理屏幕函数。

void swap(int a,int b){t=a;a=b;b=t;}不能交换变量,错误;

void swap(int *p1,int *p2){int p=*p1;*p1=*p2;*P2=p;}可以交换变量,正确;

void swap(int *p1,int *p2){int *p=p1;p1=p2;p2=p;}形参指向的地址改变了,变量没变,错误。

main函数中,结构体不初始化缺省为0xcc,全局去不初始化缺省为0x00。

头文件中,函数声明、变量声明、常量声明/定义、结构体声明/定义可以放;函数体、变量定义不可以放在头文件中。

fopen打开文件,fclose关闭文件,fread读取文件,fwrite写入。

system("pause");

#include PI 3.1415926     常量定义,无分号。

typedef unsighed int size_t;对类型重新定义,后面有分号。

#include时,系统头文件用< >,自己写的头文件用"   "。

常量定义方式有#define,const,enum。其中,enum可以连续定义多个。

enum EMUM

{     i=10,j,k,

};

没定义数字时,以0为起点,其余变量依次加1。

定义时,enum ENUM e=SIZE;

枚举变量大小与整型变量相同,与成员列表个数无关;枚举变量只限制列表中的常量赋值,不可以用其他整数赋值。

指针常量:不允许修改地址,是地址不变的指针。(禁止偏移,允许赋值)

常量指针:不允许修改内容,是内容不变的常量,指向常量的地址。(禁止赋值,允许读取,允许偏移)

数组类似于不可偏移的指针(指针常量)。char s[20]="abcd";正确,s[1]='x';正确,s="abcd";错误。

指针数组:char *p[]={"aaa","bbb"};

函数指针:将函数地址当做参数传递,指向函数的指针。定义:返回值类型(*指针变量名)(参数列表)。赋值时,指针变量函数名;调用时,(*指针变量名)函数名(实参)或指针变量名(实参)。

结构体按位定义字节:

struct SDate{unsighed int nYear:11;unsighed int nMonth:4;};年用11位表示,月用4位表示。

共用体(联合体):所有变量共用一个空间,共用一个首地址。

C语言中,二维数组不可以直接给二级指针赋值。

类型定义,typedef int (*FUN_TYPE) (int a,int b);此为将长名字定义为短名字,用FUN_TYPE定义同类型的指针。

回调函数:将函数地址通过参数传递出来。

二维数组中,int a[3][4];中,a[0]类型为int [4]数组。sizeof(a)/sizeof(a[0])得到行数;sizeof(a[i])/sizeof(a[i][0])得到列数。行指针:(*a)[4];a++时偏移一行。*a和a[0]都指向第一行的4列,类型为int [4]。**a和*a[0]和a[0][0]都是指向第一行第一列。

二级指针:对一级指针的地址取地址。指向指针的指针。int *p=&n;int **q=&p;q的来源类型是int*类型。

二级指针做参数,带入的是一个一级指针的地址,改变的是实际参数所指向的地址;一级指针做参数,带入的是普通变量的地址,改变的是实际参数的数。

二级指针一般作用为:为一级指针申请堆空间。int **q={"abc","def",0};需要有空地址0做结尾。

free(p)时必须free申请时的地址,p++后已经不是原地址。

随机数,srand();rand();srand((unsighed)time(NULL)).

限制随机数范围,300到800,为300+rand()%500

 

C++

 

bool变量一个字节(和char相同),true和false。

引用型变量(别名变量):新申请的变量挂在原变量的内存地址上,(必须初始化)&p= i;

命名空间,将自己的函数包含,MYY::add();

namespce MYY {}打开时用using namespace MYY

重载函数:函数名相同,参数类型和个数不完全相同。

一个int型堆空间申请 int *p =new int;delete p;C语言中为 int *p=(int *)malloc(sizeof(int));free(p);

2个Int型堆空间申请int *p=new int[2];delete []p;如果为new int(2)则初始化为2。

多个指针数组堆空间申请,int **p=new int * [n];

C++输入函数cin>>i>>j;输出函数cout<<endl;

int i(5)等价于i初始化为5。

函数形参初始化时默认为从右向左,不能间隔初始化,则相应的实参可以不传递。

结构体重成员函数不占用空间和地址。

内联函数:清除函数调用时的时间开销,类似于宏定义,不进入函数,不进栈,不占用空间。内联函数检查参数类型。inline

成员函数中有与成员变量相同的局部变量,则使用就近原则。

成员函数中临时变量与成员变量相同,则用this指针调用成员变量。

数组不可以用=赋值,需用strcpy等。结构体可以用=复制。

面向对象的三大特征:封装,多态,继承。

析构函数,清理空间,没有返回值,没有参数,生命期结束后系统自动调用,一般用来删除申请的堆空间。

构造和析构关系:先构造的后析构。

全局定义的对象,main函数之前调用构造函数,整个程序结束之后调用析构函数。局部定义的对象,到达该处时调用构造函数,离开时调用析构函数。static定义的全局对象,到达该处时调用构造函数,整个程序结束时调用析构函数,即再次进入函数体后不进行初始化。

全局变量不可以放在头文件中,只能在头文件中用extern声明。

class缺省为私有成员,struct缺省为公有。

类成员对象地址从小到大排列,先定义先构造,先定义后析构。栈内对象地址从大到小排列。

类内对象都构造完后,然后在构造类自身对象。类自身对象先析构,然后类内对象再析构。

类内有静态成员函数时,实际为全局函数,名义上划分为类内,但无this指针。静态成员变量同。

MFC链表头文件为#include<afxtempl.h>

只读成员函数后面加const。只读函数中,this指针指向部分不能修改,形参、实参、临时变量可以修改。

只读成员变量只能在构造函数初始化列表中赋值。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值