創建命名空間:
- 形式:namespace myNamespace{ //stuff }
- 注意:在最末尾右花括號的後面不需要加上分號。
- 1) 在預處理器指令的後面、類聲明的前面,開始定義命名空間;
2) 類聲明和類實現應該放在同一個命名空間裏;
3) 只能在全局範圍或另一個命名空間的內部定義一個命名空間(命名空間可以嵌套),不能在函數或類裏定義命名空間;
4) 可以把任何東西放到命名空間裏,而不僅僅是類;還可以用 namespace 關鍵字爲現有的命名空間創建別名,比如,
namespace dog = reallyLongDogBasedNamespace;
使用命名空間
1) using namespace std; cout << “Hi”;
2) using std::cout; cout << “Hi”;
3) std::cout << “Hi”
返回指針的函數
指針作爲函數的返回值
如果函數需要返回一個字符串,我們可以返回(char*)類型字符串,不要使用字符數組,因爲字符數組在函數執行結束後,就釋放了。而使用(char *)聲明的字符串是存儲在數據段的,直到程序執行結束纔會釋放。
#include <stdio.h>
#include <stdlib.h>
char *getWeekDay(int day)
{
return "星期N";//返回的是字符串在數據段(常量區)中的地址
}
int main(){
char *weekDay = getWeekDay(2);
return 0;
}
指向函數的指針
可以用指針指向函數,語法:返回值類型 (*指針名)(【參數列表】);
1.函數的地址就是函數名。
2.指向函數的指針變量,本質上還是一個變量,那麼我們就可以聲明、賦值給另外一個同類型的指針變量使用。
無參無返回值
#include <stdio.h>
voidtestFunction()
{
printf("這是一個無參無返回值的函數\n");
}
intmain(intargc,constchar*argv[]){
//指針指向函數
void(*pFunction)()=testFunction;//存儲沒有返回值沒有參數的地址,函數名就是函數的地址
//指針調用函數
(*pFunction)();
pFunction();//簡寫
return0;
}
有參有返回值
#include <stdio.h>
int getSum(int num1,int num2)
{
return num1 + num2;
}
int main(int argc, const char * argv[])
{
//指針指向函數,參數列表可以省略
int (*pFunction)() = getSum;
//指針調用函數
int sum = pFunction(10,12);
printf("sum = %d\n",sum);
return 0;
}
結構體
結構體的聲明:
結構體裏的聲明的多個數據類型變量叫做結構體的成員。
聲明結構體類型語法:
struct 類型名 {
數據類型1 成員名1;
數據類型2 成員名2;
..........
};
聲明結構體變量語法:
struct 類型名 變量名;
//聲明類型的同時聲明變量
struct Student {
char *name;
int age;
float heigth;
}stu,stu1;//可以同時聲明多個變量
//匿名結構體。聲明類型的同時聲明變量,可以省略類型名,但是這種方法不能再次聲明新的變量了
struct {
char *name;
int age;
float heigth;
}stu,stu1;//也可以同時聲明多個變量
//聲明類型,再聲明變量
struct Student {
char *name;
int age;
float heigth;
};
struct Student stu1,stu2;//變量名是stu1,stu2.可以同時聲明多個變量
struct Student stu2;//變量名是stu2
爲結構體變量中的成員賦值
#include <stdio.h>
int main(intargc,constchar*argv[])
{
//聲明一個結構體Student1
structStudent1
{
char*name;
intage;
floatheigth;
};
structStudentstu1;
stu1.name="zhoujianfeng";//單獨爲變量的每個成員賦值
stu1.age=18;
stu1.heigth=1.9f;
//聲明一個結構體Student2
structStudent2{
char*name;
intage;
floatheigth;
};
structStudentstu2={"zhoujianfeng",18,1.9f};//聲明變量的同時初始化
structStudentstu3={"zhoujianfeng",18};//初始化部分
structStudentstu4={.age=18};//指定成員初始化
structStudentstu5=stu2;//將stu2賦值給stu5
return0;
}
使用結構體注意:
1.這個新聲明的結構體也是一個數據類型,由程序員自己聲明的新類型,所以可以聲明這個結構體類型的變量。
2.定義在大括號之中的變量,叫新類型的成員。必須要先聲明結構體類型,再聲明結構體變量。
3.結構體類型名首字母大寫,並且結構體末尾需要加分號,
4.聲明一個結構體變量沒有初始化,成員的值是垃圾值,如果聲明的同時初始化了部分,其他成員初始化爲0。
5.相同類型的結構體變量是可以相互賦值的,賦值是將原結構體中的每一個成員的值挨個拷貝給目標結構體變量。
6.結構體變量名,直接代表整個結構體變量。在外面學習到的所有數據類型中,只有數組名、函數名才代表他們的地址。其他都是代表變量本身
結構體與數組:
語法:struct 結構體類型名 數組名[長度];
#include <stdio.h>
int main(int argc, const char * argv[]) {
struct Student {
char *name;
int age;
int score;
};
//stuArray數組的每一個元素的類型是一個struct Student結構體類型
struct Student stuArray[] = {
{"小明",19,99},
{"小芳",19,99},
{"小東",18,20}
};
//單獨初始化一個元素,需要做類型強轉,不然編譯器不知道賦值給數組還是結構體
stuArray[0] = (struct Student){"小明",19,100};
//數組長度 = 數組佔的總字節數 / 每個元素佔的字節數
int length = sizeof(stuArray)/sizeof(struct Student);
//遍歷數組,打印3個學生的信息
for(int i = 0; i < length; i++){
printf("%s %d %d\n",stuArray[i].name,stuArray[i].age,stuArray[i].score);
}
return 0;
}
結構體與指針:指針指向結構體變量(通過指針間接操作結構體變量)。
語法:struct 結構體類型名 *指針名;
#include<stdio.h>
struct Student{
char*name;
int age;
int score;
};
int main(intargc,constchar*argv[]){
//初始化變量
struct Studentstu={"靜靜",19,100};
//p指針指向stu變量
struct Student*p=&stu;
//第一種方式
(*p).name="芳芳";
(*p).age=18;
(*p).score=99;
//第二種方式
p->name="東東";
p->age=18;
p->score=99;
printf("%s
%d %d\n",p->name,p->age,p->score);
return 0;
}
結構體的嵌套:
在結構體內聲明另一個結構體類型的變量作爲成員來使用
#include <stdio.h>
//日期結構體類型
struct Date{
int year;
int month;
int day;
};
//人結構體類型
struct Person {
char *name;
int age;
struct Date birthday;
};
int main(int argc, const char * argv[]) {
//創建一個人並賦值
struct Person zhouJianFeng = {"周劍峯",23,{2015,9,18}};
// struct Person zhouJianFeng = {"周劍峯",23,2015,9,18};//可以成員的省略大括號
//打印出這個人的信息
printf("姓名:%s\n年齡:%d\n生日:%d年%d月%d日\n",zhouJianFeng.name,zhouJianFeng.age,zhouJianFeng.birthday.year,zhouJianFeng.birthday.month,zhouJianFeng.birthday.day);
return 0;
}
結構體與函數:
結構體作爲函數的參數
#include<stdio.h>
//人結構體類型
structPerson{
char*name;
intage;
};
void test(struct Person*stu){
stu->name="周劍峯";
stu->age=18;
}
int main(){
struct Personzhou={"靜靜",19};
test(&zhou);//調用函數,傳入地址
printf("%s%d\n",zhou.name,zhou.age);
return 0;
}
結構體作爲函數的返回值
#include <stdio.h>
//人結構體類型
struct Person{
char*name;
int age;
};
struct PersongetStu(){
struct Personstu={"靜靜",19};
return stu;//是返回一個變量的值
}
int main(){
struct Personstu=getStu();
printf("%s%d\n",stu.name,stu.age);
return 0;
}