您的位置:首页 > 编程语言 > C语言/C++

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

2017-09-28 16:56 513 查看
创建命名空间:

形式: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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息