變量總是有值的
變量總是有值的,即使你沒有初始化拴泌。變量的值就是內(nèi)存的值魏身,內(nèi)存里每個位的值要么是1要么是0,總有一個值蚪腐。當(dāng)一個變量被聲明而未初始化時箭昵,它的值稱為原始值或隨機(jī)值。
一般如果一個變量沒有賦值回季,想要打印就會報錯家制。其實這只是輔助檢查錯誤的模式而已。在生成->配置管理器->將Debug改為Release泡一,就不會報錯了颤殴。
在Debug編譯模式下,程序包含了一個輔助調(diào)試信息瘾杭,才會出錯诅病。
在Linux下,使用-g編譯表示Debug模式
typedef的用法
用于給已有的類型聲明一個別名,確切的說贤笆,不是定義一個類型蝇棉,而是定義一個類型的別名。
#include<stdio.h>
typedef unsigned int UINT32;
int main()
{
UINT32 a;
UINT32* p = &a;
unsigned int b;
p = &b;
return 0;
}
這種只是寫法的簡化而已
在舊的C語法中芥永,struct用起來比較麻煩篡殷,一般用typedef進(jìn)行簡化
//C語言寫法
struct Student
{
int id;
char name[16];
}
//建立Student對象,需要加上Student
struct Student s;
//建立Student對象埋涧,使用typedef簡化
typedef struct Student student_t;
student_t s;
//C語言使用typedef板辽,更大的簡化
typedef struct
{
int id;
char name[16];
}Student;
Student s;
名字太長的模板類
#include<list>
struct Student
{
int id;
};
typedef list<Student> StudentList;
typedef和#define相比
typedef unsigned int UINT32;
#define UINT32 unsigned int
不推薦使用宏定義#define,宏定義是預(yù)編譯過程棘催,typedef是編譯劲弦。宏定義只是文本替換,typedef是完全代表了unsigned int
main函數(shù)之前的函數(shù)
我們知道m(xù)ain函數(shù)是程序的入口醇坝,第一個被執(zhí)行的函數(shù)邑跪,而在引入構(gòu)造函數(shù)后,事情發(fā)生了變化呼猪。
定義一個class類型的全局變量画畅,則全局變量的構(gòu)造函數(shù)會先于main函數(shù)被執(zhí)行
#include<stdio.h>
class Object
{
public:
Object()
{
printf("created!\n");
}
};
Object obj;
int main()
{
printf("...\n");
return 0;
}
如果定義了多個全局變量,很難確定哪個先被構(gòu)造宋距,哪個后被構(gòu)造轴踱。所以盡量不使用全局變量,如果一定要使用谚赎,則要保證其構(gòu)造函數(shù)不要太復(fù)雜淫僻。
絕對路徑、當(dāng)前路徑沸版、相對路徑
絕對路徑又叫全路徑嘁傀,C:/windows/system32/abc.dll
當(dāng)前路徑兴蒸,指的是程序的工作目錄视粮,當(dāng)一個文件只有名字沒有目錄的時候,表示在當(dāng)前程序(.sln文件所在)目錄下創(chuàng)建
const char* filepath = "abc.txt";
FILE* fp = fopen(filepath,"wb");
在哪里運行exe文件橙凳,生成的abc.txt就在哪里蕾殴。vs里可以在項目屬性調(diào)試?yán)锩嬖O(shè)置工作目錄
在程序里可以手工寫代碼調(diào)整工作目錄
#include<windows.h>
SetCurrentDirectoryA("D:\\test\\cpp");
相對路徑
工作目錄為D:/cpp/hello
"output/abc.txt"即為D:/cpp/hello/output/abc.txt
"./output/abc.txt"即為D:/cpp/hello/output/abc.txt,點號表示在本目錄
"../abc.txt"即為D:/cpp/abc.txt岛啸,..表示在上層目錄
"../../abc.txt"即為D:/abc.txt
數(shù)組的特殊用法
數(shù)組:若干連續(xù)的元素钓觉,在內(nèi)存上也是連續(xù)的
數(shù)組名:這一塊內(nèi)存的首地址
#include<stdio.h>
void test(int arr[],int len)
{
int n = sizeof(arr); //值為4,此時它計算的是int arr[]的大小坚踩,是int類型的荡灾,故為4
printf("%d\n",n);
}
int main()
{
int arr[5]={1,2,3,4,5};
test(arr,5);
return 0;
}
int arr[5]={1,2,3,4,5};
int n = sizeof(arr);//值為20
int arr[5]={1,2,3,4,5};
int* p = arr;
int m = sizeof(p);//值為4
作為數(shù)組變量時,得到的是正確的大小,作為函數(shù)參數(shù)時批幌,只是一個普通的指針變量而已础锐,就是4。
二維數(shù)組的用法
int arr[2][4] =
{
{1,2,3,4},
{5,6,7,8},
};
數(shù)組名就是地址荧缘,二維數(shù)組的數(shù)組名是否也可以傳地址呢皆警?
void test(int data[][4],int rows)
{
for(int i=0;i<rows;i++)
{
for(int j=0;j<4;j++)
{
printf("%d",data[i][j]);
}
}
}
int main()
{
int arr[2][4] =
{
{1,2,3,4},
{5,6,7,8},
};
test(arr,2);
}
或者(不推薦)
void test(int (*p)[4],int rows)
{
for(int i=0;i<rows;i++)
{
for(int j=0;j<4;j++)
{
printf("%d",p[i][j]);
}
}
}
int main()
{
int arr[2][4] =
{
{1,2,3,4},
{5,6,7,8},
};
int (*p)[4] = arr;
test(arr,2);
}
頭文件的搜索目錄
把Object結(jié)構(gòu)體定義放在Object.h文件,在main.cpp使用
#include<stdio.h>
#include "Object.h"
為什么一個尖括號一個雙引號
尖括號表示從標(biāo)準(zhǔn)目錄搜索該文件截粗,雙引號表示先從當(dāng)前目錄搜索該文件信姓,再從標(biāo)準(zhǔn)目錄搜索