1、return语句不可返回指向“栈内存”的“指针”或“引用”,因为该内存在函数体结束时呗自动销毁
2、布尔类型、整型、浮点型判断真伪的if语句不一样
3、线性表的相关操作:
(1)创建
(2)销毁
(3)得到长度
(4)从线性表删除一个元素
(5)从线性表添加一个元素
(6)在线性表的特定位置添加元素
4、断言assert是仅在Debug版本起作用的宏,它用于检查“不应该”发生的情况,在运行过程中,如果assert的参数为假,那么程序就会中止
5、void *memcpy(void *pvTo, const void *pvFrom, size_t size)
{
assert((pvTo != NULL) && (pvFrom != NULL)); // 使用断言
byte *pbTo = (byte *) pvTo; // 防止改变pvTo的地址
byte *pbFrom = (byte *) pvFrom; // 防止改变pvFrom的地址
while(size -- > 0 )
*pbTo ++ = *pbFrom ++ ;
return pvTo;
}
6、以下程序中,n是m的一个引用(reference),m是被引用物(referent)。
int m;
int &n = m;
n既不是m的拷贝,也不是指向m的指针,其实n就是m它自己
7、如果指针p是函数的参数,那么在函数的入口处用assert(p!=NULL)进行检查。
如果是用malloc或new来申请内存,应该用if(p==NULL) 或if(p!=NULL)进行防错处理。
8、数组
char a[] = "hello";
char b[10];
strcpy(b, a); // 不能用 b = a;
if(strcmp(b, a) == 0) // 不能用if (b == a)
9、指针
int len = strlen(a);
char *p = (char *)malloc(sizeof(char)*(len+1));
strcpy(p,a); // 不要用p = a;
if(strcmp(p, a) == 0) // 不要用if (p == a)
10、sizeof(p)得到的是一个指针变量的字节数,相当于sizeof(char*),而不是p所指的内存容量。
char a[] = "hello world";
char *p = a;
cout<< sizeof(a) << endl; // 12字节
cout<< sizeof(p) << endl; // 4字节
11、注意当数组作为函数的参数进行传递时,该数组自动退化为同类型的指针。
void Func(char a[100])
{
cout<< sizeof(a) << endl; // 4字节而不是100字节
} sizeof(a)始终等于sizeof(char *)
12、如果函数的参数是一个指针,不要指望用该指针去申请动态内存;指针可以用作输出参数
void GetMemory(char *p, int num)
{
p = (char *)malloc(sizeof(char) * num);
}
void Test(void)
{
char *str = NULL;
GetMemory(str, 100); // str 仍然为NULL
strcpy(str, "hello"); // 运行错误
}
13、如果非得要用指针参数去申请内存,那么应该改用“指向指针的指针”
void GetMemory2(char **p, int num)
{
*p = (char *)malloc(sizeof(char) * num);
}
void Test2(void)
{
char *str = NULL;
GetMemory2(&str, 100); // 注意参数是&str,而不是str
strcpy(str, "hello");
cout<< str << endl;
free(str);
}
2、布尔类型、整型、浮点型判断真伪的if语句不一样
3、线性表的相关操作:
(1)创建
(2)销毁
(3)得到长度
(4)从线性表删除一个元素
(5)从线性表添加一个元素
(6)在线性表的特定位置添加元素
4、断言assert是仅在Debug版本起作用的宏,它用于检查“不应该”发生的情况,在运行过程中,如果assert的参数为假,那么程序就会中止
5、void *memcpy(void *pvTo, const void *pvFrom, size_t size)
{
assert((pvTo != NULL) && (pvFrom != NULL)); // 使用断言
byte *pbTo = (byte *) pvTo; // 防止改变pvTo的地址
byte *pbFrom = (byte *) pvFrom; // 防止改变pvFrom的地址
while(size -- > 0 )
*pbTo ++ = *pbFrom ++ ;
return pvTo;
}
6、以下程序中,n是m的一个引用(reference),m是被引用物(referent)。
int m;
int &n = m;
n既不是m的拷贝,也不是指向m的指针,其实n就是m它自己
7、如果指针p是函数的参数,那么在函数的入口处用assert(p!=NULL)进行检查。
如果是用malloc或new来申请内存,应该用if(p==NULL) 或if(p!=NULL)进行防错处理。
8、数组
char a[] = "hello";
char b[10];
strcpy(b, a); // 不能用 b = a;
if(strcmp(b, a) == 0) // 不能用if (b == a)
9、指针
int len = strlen(a);
char *p = (char *)malloc(sizeof(char)*(len+1));
strcpy(p,a); // 不要用p = a;
if(strcmp(p, a) == 0) // 不要用if (p == a)
10、sizeof(p)得到的是一个指针变量的字节数,相当于sizeof(char*),而不是p所指的内存容量。
char a[] = "hello world";
char *p = a;
cout<< sizeof(a) << endl; // 12字节
cout<< sizeof(p) << endl; // 4字节
11、注意当数组作为函数的参数进行传递时,该数组自动退化为同类型的指针。
void Func(char a[100])
{
cout<< sizeof(a) << endl; // 4字节而不是100字节
} sizeof(a)始终等于sizeof(char *)
12、如果函数的参数是一个指针,不要指望用该指针去申请动态内存;指针可以用作输出参数
void GetMemory(char *p, int num)
{
p = (char *)malloc(sizeof(char) * num);
}
void Test(void)
{
char *str = NULL;
GetMemory(str, 100); // str 仍然为NULL
strcpy(str, "hello"); // 运行错误
}
13、如果非得要用指针参数去申请内存,那么应该改用“指向指针的指针”
void GetMemory2(char **p, int num)
{
*p = (char *)malloc(sizeof(char) * num);
}
void Test2(void)
{
char *str = NULL;
GetMemory2(&str, 100); // 注意参数是&str,而不是str
strcpy(str, "hello");
cout<< str << endl;
free(str);
}