C++的基礎知識(八)--命名空間、結構體

創建命名空間:

  • 形式: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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章