c++学习笔记(2)数组,函数,指针,结构体

目录

1、一维数组

2、二维数组

3、函数

4、函数分文件编写:

5、指针

5.1 定义指针

5.2const修饰指针 (const后面的值不可以改)

5.3指针访问数组

6、结构体


1、一维数组

一维数组定义的三种方式:

1。数据类型 数组名[数组长度];

2。数据类型 数组名[数组长度] = {值1,值2.。。。。};

3。数据类型 数组名[] = {值1,值2.。。。。};  可推测出长度

数组特点 连续存储空间,每个元素相同数据类型

未定义的用0填补

定义数组时必须知道初始长度

命名规范与变量相同

sizeof(arr)  求数组长度

cout<<arr<<endl; 输出数组在内存中首地址

cout<<int(arr)<<endl; 输出数组在内存中首地址(十进制)  如果报错说明超过int取值范围,可改为long

数组名是常量,不可以进行赋值

2、二维数组

四种定义方式:

1.数据类型 数组名[行数][列数];

2.数据类型 数组名[行数][列数] = {{数据,数据},{},{}};  常用

3.数据类型 数组名[行数][列数] ={数据1,数据2,3,4};

4.数据类型 数组名[       ][列数] ={数据1,数据2,3,4};

3、函数

返回值类型 函数名 (参数列表) void为空

{

            函数体语句;

            return表达式;

}

值传递:函数调用时实参将数值传入给形参,值传递时,如果形参发生变化,并不会影响实参

常见函数样式:无参无返 有参无返 无参有返 有参有返

函数声明:告诉编译器函数名称及如何调用函数,函数的实际主体可以单独定义。函数的声明可以多次,函数定义只有一次eg:int max(int a,int b);

4、函数分文件编写:

1.创建.h头文件

2.创建.cpp源文件

3.在头文件中写函数的声明

4.在源文件中写函数的定义

在使用的cpp文件中先添加对应的头文件

5、指针

5.1 定义指针

定义指针 int a = 10;

int * p;

p = &a;

使用指针 可以通过解引用的方式来找到指针指向的内存

在32位操作系统下x86,指针占4字节,64位占8字节x64

空指针 指针变量指向内存中编号为0的空间

用途:初始化指针变量  int *p = NULL

注意:空指针指向的内存是不可以访问的  内存编号0-255为系统占用内存,不允许用户访问

野指针:指针变量指向非法的内存空间

如:int * p = (int*)0x1100;访问会报错

空指针和野指针都不是我们申请的空间,因此不要访问

5.2const修饰指针 (const后面的值不可以改)

int a = 10;

int b = 10;

int *p = &a;

1.const修饰指针  常量指针

const int *p=&a;

指针的指向可以改,但指向的值不能改

*p = 20; 错误,指向的值不可改

p=&b; 正确,指针指向可以改

2.const修饰常量  指针常量

int * const p = &a;

指针的指向不可以改,指针指向的值可以改

*p = 20; 正确,指向的值可改

p=&b; 错误,指针指向不可改

3.const既修饰指针,又修饰常量

const int *const p=&a;

指针的指向和指针指向的值都不能改

5.3指针访问数组

int arr[10] = {1,2,3};

int * p = arr;

for (int i = 0;i<3;i++)

{

cout<<*p<<endl;

p++;

}

地址传递可以修饰实参

6、结构体

结构体属于用户自定义的数据类型,允许用户存储不同的数据类型

语法:struct 结构体名 {结构体成员列表};

结构体创建变量:

struct 结构体名 变量名

struct 结构体名 变量名={成员1值,成员2值。。。}

定义结构体时顺便创建变量

结构体创建时可以省略struct关键字,定义时不能省略

// 创建结构体

struct Student {

string name;

int age;

int score;

}s3;

示例:

int main() {

// 利用结构体创建变量

//1

struct Student s1;

s1.age = 20;

s1.name = "张三";

s1.score = 90;

cout << "张三" << s1.name << s1.age << s1.score << endl;

//2

struct Student s2 = { "李四",22,91 };

cout << s2.name << "  " << s2.age << "  " << s2.score << endl;

//3

s3.age = 23;

s3.name = "王五";

s3.score = 93;

cout  << s3.name << "  " << s3.age << "  " << s3.score << endl; 

结构体数组 将自定义的结构体放入数组中方便维护

语法 struct 结构体名 数组名[元素个数] = { {},{},{}。。。 }

结构体指针

通过指针指向结构体变量

Student *p = &s1;

cout <<p->name<<p->age<<p->score<<endl;

结构体嵌套结构体  结构体的成员可以是另一个结构体

创建:t.stu.name = "zhangsan";  t 和stu都是结构体

结构体做函数参数 值传递 地址传递

将函数中的形参改为指针,可以节省内存空间,而且不会复制新的副本

结构体使用const 防止误操作

void printstudent(const student *s){}