C++蜗牛
1:windows静态连接
#include “mysock.h” // 头文件
#pragma comment (lib, “myxock.lib”) 对应的静态库库文件
作用:实现windows静态库的手动连接
作用:将内容清空
用法 int InitHardEnv(void **handle);
void*指针作为左值用于“接收”任意类型的指针
void*指针作为右值赋值给其它指针时需要强制类型转换
典型的如内存操作函数memcpy和memset的函数原型分别为
void * memcpy(void *dest, const void *src, size_t len);
void * memset ( void * buffer, int c, size_t num );
5:const int* c c是一个指向常整形数的指针(所指向的内存数据不能被修改,但是本身可以修改)
Int* const d d是常指针(指针变量不能被修改,但是它所指向内存空间可以被修改)
Const int* const e e是一个指向常整形的常指针(指针和它所指向的内存空间,均不能被修改)
C++编译器对const常量的处理
当碰见常量声明时,在符号表中放入常量 =问题:那有如何解释取地址
编译过程中若发现使用常量则直接以符号表中的值替换
编译过程中若发现对const使用了extern或者&操作符,则给对应的常量分配存储空间(兼容C)
结论:
指针和指针所指向的内存空间是两个不同的概念,使用内存四区图来进行理解
看const的作用,看const 是修饰×的左边还是右边,左边就是指针变量可以改(可以使用a=a+1,a为指针),但是该指针所指向的内存块不可以改变内容;右边就是指针变量不能改,但是该指针所指向的内存块可以改变内容。
引用是地址,引用是常量,引用所占的空间大小与指针相同,使用常指针实现
Const & 相当于const int* const e;
普通引用相当于int* const e1;
只有参数列表后面部分的参数才可以提供默认参数值
一旦在一个函数调用中开始使用默认参数值,那么这个参数后的所有参数都必须使用默认参数值
函数返回值不能作为函数重载的依据
由函数名和参数列表决定的
重载函数在本质上是相互独立的不同函数(静态链编)
当函数默认参数遇上函数重载
int func(int a, int b, int c = 0);int func(int a, int b);
c = func(1, 2)执行出错,存在二义性,编译通不过
重载和函数指针结合
当使用重载函数名对函数指针进行赋值时
根据重载规则挑选与函数指针参数列表一致的候选者
严格匹配候选者的函数类型与函数指针的函数类型
int func(int x) // int(int a)
{
return x;
}
int func(int a, int b)
{
return a + b;
}
int func(const char* s)
{
return strlen(s);
}
typedef int(*PFUNC)(int a); // int(int a)
int main(int argc, char *argv[])
{
int c = 0;
PFUNC p = func;
c = p(1);
printf("c = %d\n", c);
printf("Press enter to continue ...");
getchar();
return 0;
}
9:
C语言中其返回的是变量的值,在c++中返回的是变量本身,也就是说c中不能做左值,c++中能做左值。(注意,如果可能返回的值中有一个是常量,那么就不能作为左值使用)
Const常量是由编译器处理的,提供类型检查和作用域检查;宏定义由预处理器处理,单纯的文本替换。
12:copy构造函数(赋值构造函数)
赋值构造函数和=操作是两个不同的概念。当我们没有编写copy构造函数(赋值构造函数)的时候,c++编译器会默认给我们提供一个copy构造函数 执行的是浅copy
深拷贝和浅拷贝
13:c++/c中获取char【】数组的字符串长度
Strlen(const char*);
Sizeof (type);
二级指针的第一种内存模型
Char * Accary [ ] = { “aaaaaa”, ”bbbbbb”, ”ccccccc” };
//接口形参使用方式
Int printfarr(char **ArrayStr, int iNUm)
{
For (i =0; i<iNUm; i++)
{
Printf(“%s \n”, ArrayStr[i]);
}
}
//调用方式
Printfarr(Accary , 3);
二级指针的第二种内存模型
Char Array[10][30] = {“aaaa”, “bbbb”, “cccccc”,};
// 接口形参使用方式
Void abc(char Arrary[30], 4 )
{
For (i=0; i<4; i++)
{
Printf(“%s \n”,Accary[i]);
}
}
//调用方式
Printfarr(Array , 3);
二级指针的第三钟内存模型
char **real = (char **)malloc(3*sizeof(char *));
for (int i=0; i<3; i++)
{
real[i] = (char *)malloc(30*sizeof(char));
}
sprintf(real[0],"dbsiudaudhakdhjhba");
sprintf(real[1],"b");
printf("%s \n", real[1]);
//接口形参使用方式
Int printfarr(char **ArrayStr, int iNUm)
{
For (i =0; i<iNUm; i++)
{
Printf(“%s \n”, ArrayStr[i]);
}
}
//调用方式
Printfarr(Accary , 3);
形参写法的引申:
Void str(char abc[30]);
void str(char abc[ ]); 一维数组做形参,退化为指针
void str(char abc);手工加 * ,手工完成编译器任务
//针对第二种内存模型
Void str(char abc[30][60]);
void str(char abc[ ][60]); 二维数组做形参,退化为指针,60为指针步长
void str(char (*abc)[60]);手工加 * ,手工完成编译器任务,其实就是数组指针
等价关系
数组参数 等效指针参数
一维数组 char a[ 30 ] -------------------------------> 指针char × a
指针数组char × a [ 30]-------------------------------->指针的指针 char × × a
二位数组 char a[30 ][30]-------------------------------->数组的指针 char(×a)[30]
16:ASCII编码对照表
ASCII值 字符 ASCII值 字符 ASCII值 字符
Decimal Hex Decimal Hex Decimal Hex
000 000 NUL 020 014 DC4(^T) 040 028 (
001 001 SOH (^A) 021 015 NAK(^U) 041 029 )
002 002 STX (^B) 022 016 SYN(^V) 042 02A *
003 003 ETX (^C) 023 017 ETB(^W) 043 02B +
004 004 EOT (^D) 024 018 CAN(^X) 044 02C ,
005 005 ENQ (^E) 025 019 EM(^Y) 045 02D -
006 006 ACK (^F) 026 01A SUB(^Z) 046 02E .
007 007 BEL (Bell) 027 01B ESC 047 02F /
008 008 BS (^H) 028 01C FS 048 030 0
009 009 HT (^I) 029 01D GS 049 031 1
010 00A LF (^J) 030 01E RS 050 032 2
011 00B VT (^K) 031 01F US 051 033 3
012 00C FF (^L) 032 020 (空格) 052 034 4
013 00D CR (^M) 033 021 ! 053 035 5
014 00E SO (^N) 034 022 " 054 036 6
015 00F SI (^O) 035 023 # 055 037 7
016 010 DLE (^P) 036 024 $ 056 038 8
017 011 DC1 (^Q) 037 025 % 057 039 9
018 012 DC2 (^R) 038 026 & 058 03A
019 013 DC3 (^S) 039 027 ' 059 03B
ASCII值 字符 ASCII值 字符 ASCII值 字符
Decimal Hex Decimal Hex Decimal Hex
060 03C < 099 063 c 138 08A è
061 03D = 100 064 d 139 08B ï
062 03E > 101 065 e 140 08C î
063 03F ? 102 066 f 141 08D ì
064 040 @ 103 067 g 142 08E Ä
065 041 A 104 068 h 143 08F Å
066 042 B 105 069 i 144 090 É
067 043 C 106 06A j 145 091 æ
068 044 D 107 06B k 146 092 Æ
069 045 E 108 06C l 147 093 ô
070 046 F 109 06D m 148 094 ö
071 047 G 110 06E n 149 095 ò
072 048 H 111 06F o 150 096 û
073 049 I 112 070 p 151 097 ù
074 04A J 113 071 q 152 098 ÿ
075 04B K 114 072 r 153 099 Ö
076 04C L 115 073 s 154 09A Ü
077 04D M 116 074 t 155 09B <