2019-08-03 Day6 C语言指针和结构体

目的

初步掌握C语言指针和结构体的定义和使用

指针

指针的灵活运用使得c语言更加强大,指针是C语言中十分重要的部分,可以说指针是C语言的灵魂。

为什么要使用指针

指针可以解决跨区域(不同作用域 不同代码块)之间的数据交互,同时使用指针
能够创建动态数据结构。这时内存将在程序运行的时候从堆上分配,而不用一开始就声明数组的最大规模。这样您就可以为每个文档准确地分配内存而不会产生浪费。而且,关闭一个文档时您还可以把它占用的内存返回给堆,以供程序的其他部分使用。使用指针,内存就可以在程序运行期间不断被回收利用。

指针的使用

定义指针变量与定义普通变量非常类似,不过要在变量名前面加星号*,格式为:

datatype *name;

或者

datatype *name = value;```

*表示这是一个指针变量,datatype表示该指针变量所指向的数据的类型 。例如:

int *p1;

p1 是一个指向 int 类型数据的指针变量,至于 p1 究竟指向哪一份数据,应该由赋予它的值决定。再如:

int a = 100;
int *p_a = &a;

在定义指针变量 p_a 的同时对它进行初始化,并将变量 a 的地址赋予它,此时 p_a 就指向了 a。值得注意的是,p_a 需要的一个地址,a 前面必须要加取地址符&,否则是不对的。
和普通变量一样,指针变量也可以被多次写入,只要你想,随时都能够改变指针变量的值,请看下面的代码:

//定义普通变量
float a = 99.5, b = 10.6;
char c = '@', d = '#';
//定义指针变量
float *p1 = &a;
char *p2 = &c;
//修改指针变量的值
p1 = &b;
p2 = &d;

注意指针指向的内存空间只能在存放定义数据类型的数,同时定义指针变量的时候一定要给初值 不确定就给NULL;NULL指向内存的初始地址0x00。

数组和指针之间的关系

定义一个数组 系统会分配内存空间 可以存值
定义一个指针变量 只为变量本身分配8个字节内存空间无法存值,因为系统没有为他分配内存空间。
那如果想给指针指向的区域赋值,应该怎么办呢?

1.指针变量已经指向某块区域
 int a3 = 10;
 int *pa = &a3;
 *pa = 30;
2.指针指向一个数组
 int num2[10]= {};
 int *pNum = num2;
3.动态分配内存 malloc realloc

上面两种指向的内存都是别人的,现在分配一个属于自己的内存空间,而自己分配的内存空间必须自己释放,普通变量的内存是系统自己分配 ,所以系统自己释放当分配的空间不够了,需要在之前的基础上重新分配用realloc函数但必须是之前用malloc函数进行过动态分配的 系统自己分配的内存则不能使用realloc来重新分配内存,同时一旦用完了,便自己释放内存。

malloc():
 int *pNumber = (int*)malloc(100);               // 分配100字节内存
    int *pNumber = (int*)malloc(25*sizeof(int));        //存储25个int值得内存

用 if 语句检查是否分配:

 int *pNumber = (int*)malloc(25*sizeof(int));

    if (!pNumber)
    {
        // 内存分配失败的处理代码
    }    

释放动态分配的内存:

 free(pNumber);

    pNumber = NULL;

结构体

为什么要使用结构体

由于一个数组中只能存放同一种类型的数据,很不方便,所以C语言允许用户自己建立由不同类型数据组成的组合型的数据结构,也就是结构体,把一些有共同特征(比如同属于某一类事物的属性)的变量封装在内部,通过一定方法访问修改内部变量。

结构体的使用

声明一个结构体类型的一般形式是


stuct 结构体名
    {成员列表};

例如先声明结构体类型,再定义该类型变量:

{
    int num;
    char name[20];
    char sex;
    int age;
}
struct student S1,S2;

或者在声明定义的同时定义变量:

struct student
{
    int num;
    char name[20];
    char sex;
    int age;
}S1,S2;

结构体变量的初始化和引用


#include <stdio.h>
int main()
{
    struct student
    {
        char name[20];

        int age;
     };
    struct student XW1={"zhangsan",18};
     printf("name:%s age:%d\n"XW1.name,XW1.age);
     return 0;
}

今日小结

今天所讲的内容可能是整个C语言中最难的一块了,不管是动态分布内存,还是调用文件,链表都听的一知半解,有的时候走神几分钟,就有点无法跟上进度,好在今天是C语言的最后一天,有充分的时间,对今天的内容进行整理和回顾。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 指针是C语言中广泛使用的一种数据类型。 运用指针编程是C语言最主要的风格之一。利用指针变量可以表示各种数据结构; ...
    朱森阅读 3,531评论 3 44
  • 版权声明:本文为 gfson 原创文章,转载请注明出处。注:作者水平有限,文中如有不恰当之处,请予以指正,万分感谢...
    gfson阅读 3,335评论 0 6
  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 11,171评论 1 32
  • 第十章 指针 1. 地址指针的基本概念: 在计算机中,所有的数据都是存放在存储器中的。一般把存储器中的一个字节称为...
    坚持到底v2阅读 1,112评论 2 3
  • (2017-12-26-周二 23:53:23) ①选择文本,②Alt+T (鸡肋功能)
    菜五阅读 446评论 0 0