黑马程序员——c语言的复杂数据类型:指针和结构体

时间:2023-02-19 17:00:06

——Java培训、Android培训、iOS培训、.Net培训、期待与您交流——-
一、指针介绍

指针的重要性

指针是C语言中非常重要的数据类型,如果你说C语言中除了指针,其他你都学得很好,那你干脆说没学过C语言
以后在OC中是要经常的用到指针,有些难度比较大的指针只需要理解就可以了

二、指针变量的定义
1.定义格式:

变量类型 *变量名;   例如: int *p;
指针变量只能存储地址

2.先定义后赋值
简单取值并简单改值

int *p;
int a = 90;
*p = &a;
*p = 10;
分析:不动用a的值,直接把*p的地址改为10

3.定义的同时赋值

int a = 10;
int *p = &a;

指针的作用总结:能够根据一个地址访问对应的存储空间

三、指针使用注意
1.int *P 只能指向int数据类型,不建议的写法 int *p; double d = 10.0; p = &d;
2.指针变量只能存储地址,错误写法: int * p; p = 200;
3.指针变量未经初始化,不要拿来访问其他存储空间
4. *p = &a;(错误的) int *p = &a;(正确的)
5.定义变量时,* 仅仅是一个象征,没其他特殊含义
6.p = 20; (这时候的作用是:访问指向变量p指向的存储空间)
7.因为指针变量是存储地址的,所以指针变量一定要分类型,int,char,double等
8.任何指针都占用8个字节的存储空间

四、指针习题练习
1.利用指针交换两个数的值

           #include <stdio.h>
//定义函数,用指针来交换两个数的值
void swap(int *n1, int *n2 )
{

int temp = *n1;

*n1 = *n2;

*n2 = temp;
}
int main()
{
//定义两个要交换的数值a,b

int a = 10;

int b = 20;

swap(&a,&b);

printf ("a=%d,b=%d\n",a,b);

return 0;
}

黑马程序员——c语言的复杂数据类型:指针和结构体

五、返回指针的函数

指针也是C语言中的一种数据类型,因此一个函数的返回值肯定可以是指针类型的
返回指针的函数的一般形式为:类型名 *函数名(参数列表)

         #include <stdio.h>
char *test()
{
return "jim";
}
int main()
{
char *name = test();

printf ("name=%s\n",name);

return 0;
}

黑马程序员——c语言的复杂数据类型:指针和结构体

六、指向函数的指针
1.为什么指针可以指向一个函数?

函数作为一段程序,在内存中也要占据部分存储空间,它也有一个起始地址,即函数的入口地址。
函数有自己的地址,我们的指针变量就是用来存储地址的。因此,可以利用一个指针指向一个函数。其中,函数名就代表着函数的地址。

2.指向函数的指针的定义
定义的一般形式:

函数的返回值类型 (*指针变量名)(形参1,形参2, ...);

3.指向函数的指针变量的意义:

1>.调用函数
2>.将函数作为参数在函数间传递

4.指向函数的指针小练习

#include <stdio.h>
int sum(int a, int b)
{
return a + b;
}
int main()
{
//定义指针变量指向sum函数
//指针变量p指向的函数返回int类型的数据
//右边的(int,int):指针变量p指向的2个函数有2int类型的形参
int (*p)(int,int);

p = sum;

int c = sum(10,9); //int c = p(10,9)或int c = (*p)(10,9)

printf("c=%d\n",c);

return 0;
}

黑马程序员——c语言的复杂数据类型:指针和结构体

七、指针与字符串

定义字符串的2种方式
1.利用数组

例如:char name[] = "itcast";
特点:字符串里面的字符是可以修改的
使用场合: 字符串的内容需要经常修改

2.利用指针

例如:char *name = "itcast";
特点:字符串其实是一个常量字符串,里面的字符不能修改
使用场合:字符串的内容不需要经常修改,而且这个字符串经常使用

八、指针,数组和字符串

char *names[5] = {“jack”,”rose”,”jake”}; ->指针数组(字符串数组)
char *names2[2][10] = {“jack”,”rose”}; ->二维字符数组(字符串数组)

九、局部变量
1.定义:

在函数(代码块)内部定义的变量(包括函数形参)

2.作用域

从定义变量的那一行开始,知道代码快结束

3.生命周期

从定义变量的那一行开始分配存储空间,代码结束后,就会被回收

4.没有固定的初始值

十、全局变量
1.定义:

在函数外面定义的变量

2.作用域:

从定义变量的那一行开始,一直到文件结尾(能被后面所有的函数共享)

3.生命周期:

程序一启动就会分配存储空间,程序退出时才会被销毁

4.默认初始值为0

十一、结构体

1.什么是结构体

当一个整体由多个数据构成时,我们可以用数组来表示这个整体,但是数组有个特点:内部的每一个元素都必须是相同类型的数据。
在实际应用中,我们通常需要由不同类型的数据来构成一个整体,比如学生这个整体可以由姓名、年龄、身高等数据构成,这些数
据都具有不同的类型,姓名可以是字符串类型,年龄可以是整型,身高可以是浮点型。
为此,C语言专门提供了一种构造类型来解决上述问题,这就是结构体,它允许内部的元素是不同类型的。

2.定义形式

结构体内部的元素,也就是组成成分,我们一般称为”成员”。
结构体的一般定义形式为:
struct 结构体名{
类型名1 成员名1;
类型名2 成员名2;   
};

举例:定义一个学生的结构体
struct student {int age; double height; char name;};

3.结构体变量的定义

前面只是定义了名字为Student的结构体类型,并非定义了一个结构体变量,就像int一样,只是一种类型。

定义结构体的方式一般有三种
1>.先定义结构体类型,再定义变量 (分开定义) -> 举例:struct Student {int age; double height; char *name;}
然后struct Student stu;

2>.定义结构体类型的同时定义变量 -> 举例:struct Student {int age; double height; char *name;}stu;

3>.直接定义结构体类型变量,省略类型名 -> 举例:struct {int age; double height; char *name;}stu;

4.结构体内存分配
1>.定义结构体类型(并不会分配存储空间)
2>.定义结构体变量(真正分配存储空间)
3>.补齐算法:结构体所占用的存储空间必须是最大成员字数的倍数 int age;(4字节) char *name;(8字节) 那么age跟name所占的字节为8*2=16字节

实例说明

           #include <stdio.h>
int main()
{
//定义结构体类型(并不会分配存储空间)
struct Date
{
int year;

int month;

int day;
};
//定义结构体变量(真正分配存储空间)
struct Date d1 = {2011, 4, 10};

struct Date d2 = {2012, 8 ,9};

d2 = d1;

d2.year = 2010;

printf("%d-%d-%d\n",d1.year, d1.month, d1.day);

printf("%d-%d-%d\n",d2.year, d2.month, d2.day);

return 0;
}

黑马程序员——c语言的复杂数据类型:指针和结构体

5.指向结构体的指针

1>.指向结构体指针的定义:struct student *p;
2>.利用指针访问结构体成员 例如: (*p).成员名称 或者 p ->成员名称

           #include <stdio.h>
int main()
{
//定义结构体类型
struct Student
{
int no;
int age;
};
//定义结构体变量
struct Student stu = {1, 20};
//指针变量P指向了struct Student类型的数据
struct Student *p;
//指针变量P指向了stu变量
p = &stu;
//第一种方式
printf("age=%d,no=%d\n",stu.age, stu.no);
//第二种方式
printf("age=%d,no=%d\n",(*p).age, (*p).no);
//第三种方式
printf("age=%d,no=%d\n",p->age, p->no);

return 0;
}

黑马程序员——c语言的复杂数据类型:指针和结构体

6.结构体的嵌套定义
题:编写一个学生的生日以及他的入学时间
黑马程序员——c语言的复杂数据类型:指针和结构体

黑马程序员——c语言的复杂数据类型:指针和结构体

十二、枚举类型
1.定义:

一般是指变量只有固定的几个取值,如:一年中只有春、夏、秋、冬

2.格式:

enum 枚举名{元素1,元素2}  
例如:enum Season{spring,sumer,autumn,winter};

3.定义枚举变量:

enum Season s = winter;