打算画个一两天补下C里面不熟的内容
学习参考:
【1】【C语言】C语言程序设计.浙江大学.翁恺
【2】RUNOOB.COM
【3】C语言从入门到精通资源(项目案例版)
学习内容:
-
解释/编译
-
枚举类型 enum
-
定义常量 #define const
-
存储类
auto register static 使用
static 修饰局部变量可以在函数调用之间保持局部变量的值。 static 修饰全局变量时,变量的作用域限制在声明它的文件内。
静态本地变量:函数离开时,继续保持并存在;具有全局的生存期 ,本地的作用域
extern -
字符串:使用 null 字符 ‘\0’ 终止的一维字符数组
char *word[8]=NULL;
scanf(%7s, word);//读7个字符给wordchar *[]={‘January’, ‘February’, ‘March’, ‘April’}
-
结构
today = (struct date){07, 31, 2014}
结构变量的名字并不是结构变量的地址,必须用& -
联合(共用体union):任何时候只能有一个成员带有值
-
静态本地变量:是特殊的全局变量,位于相同的内存区域,具有全局的生存期,局部作用域(本地可访问)
-
返回指针的函数:
返回本地变量的地址是危险的;返回全局变量或静态本地变量的地址是安全的
返回再函数内malloc的内存是安全的,但是容易造成问题;最好返回传入的指针 -
可变参数
-
可变数组
#include<stdio.h>
#include<stdlib.h>
#ifndef _ARRAY_H_
#define _ARRAY_H_
#define BLOCK_SIZE 20
typedef struct {
int *array;
int size;
}Array;
Array array_create(int init_size);
void array_free(Array *a);
int array_size(const Array *a);
int* array_at(Array *a,int index);
void array_inflate(Array *a, int more_size);
#endif
Array array_create(int init_size){
Array a;
a.array = (int *)malloc(sizeof(int)* init_size);
a.size = init_size;
return a;
}
void array_free(Array *a){
free(a->array);
a_array = NULL;
a->size = 0;
}
//封装
int array_size(const Array *a){
return a->size;
}
int* array_at(Array *a,int index){
if(index >= a->size){
array_inflate(a, (index/BLOCK_SIZE+1)*BLOCK_SIZE- a->size);
}
return &(a->array[index]);
}
int array_get(const Array *a, int index){
retur a->array[index];
}
void array_set(Array* a, int index, int value){
a->array[index] = value;
}
void array_inflate(Array *a, int more_size){
int *p = (int*)malloc(sizeof(int)*(a->size+more_size));
memcpy(p,a->array,a->size);
free(a->array);
a->array = p;
a->size += more_size;
}
int main(){
Array a = array_create(100);
printf("%d\n",__func__,array_size(&a));
*array_at(&a, 0) = 10;
printf("%d\n",__func__,*array_at(&a, 0));
array_free(&a);
int number, cnt =0;
while(number!=-1){
scanf("%d",&number);
if(number!=-1){
*array_at(&a, cnt++)=number;
}
}
return 0;
}
- 链表
#include<stdio.h>
#include<stdlib.h>
#ifndef _NODE_H_
#define _NODE_H_
typedef struct _node{
int value;
struct _node *next;
}Node;
typedef struct _list{
Node* head;
Node* tail;
}List;
void add(Node** pHead, int number);
void print(List *plist);
#endif
int main(){
int number;
List list;
list.head = NULL;
list.tail = NULL;
do{
scanf("%d", &number);
if(number != -1){
//add to linked-list
head = add(&list, number);
}
}while(number != -1);
//遍历
print(&list);
//删除
int isFound = 0;
scanf("%d", &number);
Node * p;
Node * q;//指向p前一个
for(q=NULL, p = plist->head; p ; q=p, p=p->next){
if(p->value ==number){
if(q){
q->next = p->next;
}else{
list->head = p->next;//**boundary
}
free(p);
break;
}
}
//清除
for(p = plist->head; p ; p=q){
q=p->next;
free(p);
}
return 0;
}
void print(List *plist){
Node * p ;
for(p = plist->head; p ; p=p->next){
printf("%d", p->value);
}
printf("\n");
}
void add(List* pList, int number){
if(pList->head){
pList->head = p;
}else{
Node * p =(Node*)malloc(sizeof(Node));
p->value = number;
p->next = NULL;
pList->tail->next = p;
pList->tail = pList->tail->next;
}
}
- __func__表示当前函数的名字
- 指针
[]优先级高于*
名称看结尾,数组指针是指针,指针数组是数组
数组,按行储存
const int *p 表示不能通过指针去修改变量(不能使变量成为const) - 类的继承方式及访问属性
参考:继承 public protect private
继承方式决定了基类的公有成员和保护成员作为派生类成员的成员类型
基类的private成员在派生类中是不能被访问的
public继承是一个接口继承,保持is-a原则,每个父类可用的成员对子类也可用;
protected/private继承是实现继承, 基类的部分成员 并非完全成为子类接口 的一部分, 是 has-a 的关系原则。 私有继承以为这is-implemented-in-terms-of(是根据……实现的) 。 通常比组合(composition) 更低级, 但当一个派生类需要访问基类保护成员或需要重定义基类的虚函数时它就是合理的。 - 友元:访问私有成员
参考:友元
非成员友元,成员函数(A类的成员函数作为B类的友元函数时,必须先定义A类,而不仅仅是声明它。),友元类
Visual Studio:
之前用的VC,后来用的VS。
Debug选项称为调试版本,所有代码生成的优化都是关闭的。需要调试程序时,选用Debug选项;需要程序快速运行时,选用Release选项。
解决方案是够成应用程序的所有项目集,一个解决方案可以包含多个项目csproj文件,建立一个解决方案会生成一个.sln文件。解决方案、项目、类及ATL的理解