C++的基础知识(八)--命名空间、结构体

本文介绍了C++中的命名空间使用,包括定义、使用方式及注意事项,并探讨了返回指针的函数和指向函数的指针的概念。此外,还详细讲解了结构体的声明、赋值以及结构体在数组、指针、嵌套和函数参数、返回值中的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

创建命名空间:

  • 形式: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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值