2019-08-03 Day6 指針的使用和結構體

目的

学习指针与结构体,理解其作用和使用方法以加深对C语言的理解和领悟;要明白指针是一个特殊的变量,它里面存储的数值被解释成为内存里的一个地址;要搞清一个指针需要搞清指针的四方面的内容:指针的类型、指针所指向的类型、指针的值或者叫指针所指向的内存区、指针本身所占据的内存区;而也要弄明白结构体也是一种数据类型,它由程序员自己定义,可以包含多个其他类型的数据,就跟int、float等一样

指针

指针是C语言显著的优点之一,指针使用起来十分灵活,而且能提高某些程序的编写效率,但是指针如果使用不当,很容易造成系统错误,许多程序的“挂死”的大部分原因都是由于错误地使用指针所造成的

使用指针的原因

指针可以解决跨区域(不同作用域 不同代码块)之间的数据交互,同时使用指针能够创建动态数据结构;这样就能使内存使用大大减少以减少浪费,从而使程序运行更流畅

指针的使用

如果有一个变量专门用来存放另一个变量的地址,则它被称为“指针变量”;而指针变量的定义方法与一般变量的定义方法相似,如下:

datatype *name;

其中,“*”表示这是一个指针变量,name即为定义的指针变量名,datatype表示本指针变量所指向的变量的数据类型
注意:定义指针变量的时候一定要给初值,不确定就给NULL
而给一个指针变量赋值可以有以下两种方法:
1.定义指针变量的同时就进行赋值

int a;
int *p = &a;

2.先定义指针变量,之后再赋值

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

示例

#include <stdio.h>
int main()
{
   int a, b;
   int *p1, *p2;
   printf("请输入苹果和香蕉的价格:\n");
   scanf("%d,%d",&a,&b);
   p1 = &a;
   p2 = &b;
   printf("苹果的价格为:%d/一斤\n",*p1);
   printf("香蕉的价格为:%d/一斤\n",*p2);
   return 0;
}

指针与数组的关系

定义一个数组 系统会给其分配内存空间,可以存值;而同时数组名并不是一个变量,系统不会给它分配内存空间
定义一个指针变量 系统只会为变量本身分配8个字节的内存空间,是无法存值的,因为没有为他分配可以存值的内存空间
如果想要给指针指向的区域赋值,有三种办法:
1.指针变量已经指向某块区域

int a3 = 10;
 int *pa = &a3;
 *pa = 30;

2.指针指向一个数组

 int num2[10]= {};
 int *pNum = num2;

3.动态分配内存 malloc realloc free
上面两种指向的内存都是别人的,而现在希望分配一个属于自己的内存空间;自己分配的内存空间必须自己释放,但普通变量的内存是系统自己分配,所以系统自己负责释放

char *pName = malloc(10 * sizeof(char));
  //判斷分配是否成功
  if(pName == NULL){
      //分配失敗
      exit(EXIT_FAILURE);
  }

  //當之前分配的內存空間不夠了 就需要在之前的基礎上重新分配
  //realloc 必須是之前使用malloc分配過得
  //如果是系統分配的內存 是不能使用realloc的
  //用完了就要自己釋放內存
  pName = realloc(pName, 4*sizeof(char));

  free(pName);

结构体

普通数组是一组具有相同类型的数据的集合。但在实际的编程过程中,我们往往还需要一组类型不同的数据,例如对于学生信息登记表,姓名为字符串,学号为整数,年龄为整数,所在的学习小组为字符,成绩为小数,因为数据类型不同,显然不能用一个数组来存放。于是我们便想到了结构体

结构体的使用

声明一个结构体的用法一般是:

struct 结构体名{
结构体所包含的变量或数组
};

结构体是一种集合,它里面包含了多个变量或数组,它们的类型可以相同,也可以不同,每个这样的变量或数组都称为结构体的成员(Member)。

struct stu{
    char *name;  //姓名
    int num;  //学号
    int age;  //年龄
    char group;  //所在学习小组
    float score;  //成绩
};

声明一种类型,struct 结构体名 ==int

struct stu{
    char *name;  
    int num;  
    int age;  
    char group;  
    float score;  
};
struct stu xw;

实际例子

#include <stdio.h>
int main(){
    struct{
        char *name;  //姓名
        int num;  //学号
        int age;  //年龄
        char group;  //所在小组
        float score;  //成绩
    } stu1;
    //给结构体成员赋值
    stu1.name = "Tom";
    stu1.num = 12;
    stu1.age = 18;
    stu1.group = 'A';
    stu1.score = 136.5;
    //读取结构体成员的值
    printf("%s的学号是%d,年龄是%d,在%c组,今年的成绩是%.1f!\n", stu1.name, stu1.num, stu1.age, stu1.group, stu1.score);
    return 0;
}

心得体会

今天学习的知识十分地难懂,特别是后面的链表,听得确实是模模糊糊的,所以说还需要下来多回顾,不要只依赖于上课的时候,继续努力,刚好用明天休息的时间来解决自己不同的地方。

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

推荐阅读更多精彩内容

  • 指针是C语言中广泛使用的一种数据类型。 运用指针编程是C语言最主要的风格之一。利用指针变量可以表示各种数据结构; ...
    朱森阅读 3,507评论 3 44
  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 11,161评论 1 32
  • 这是16年5月份编辑的一份比较杂乱适合自己观看的学习记录文档,今天18年5月份再次想写文章,发现简书还为我保存起的...
    Jenaral阅读 2,893评论 2 9
  • 趁现在没事儿,咱们聊个人儿,老钱。 老钱,大学四年,整整玩了四年游戏,还是深度沉迷的那种。要说起来,人脑子是真聪明...
    放肆的肉肉阅读 431评论 2 2
  • 今天是打假日,但是又能怎样呢。读今天的文章,我知道了我们最昂贵的礼物就是注意力。注意力是我们最重要的东西
    帅气的三侄子阅读 346评论 0 1