指针,结构体以及它们的应用

目的:
1.明白指针是什么
2.弄清指针的作用地位还有使用方法
3.指针的优缺点还有使用时的注意事项
4.学习如何定义一个结构体
5.初步使用结构体
指针:
解决跨区域(不同作用域 不同代码块)之间的数据交互
‘*’1.声明/定义变量的时候 表示一个指针变量

float b=20;
int c=10;
int*a;//定义一个指针变量 指向的内存空间只能存放整数
//注意:定义指针变量的时候一定要给初值  不确定就给NULL
int*a=b;//不行,指针变量只能存地址 不能存具体的值
int *a=&b;//不行,整型指针只能存整型数据的地址
int*a=&c;//可以
float *d = NULL;//NULL指向内存的起始地址 0x00

2.除了定义指针变量之外 都是访问某个地址的值
int *temp = &c;//定义指针变量l
*temp = 21; 访问temp地址里面的数据 赋值为21
3.动态分配内存 malloc realloc free
上面两种指向的内存都是别人的
希望分配一个属于自己的内存空间
自己分配的内存空间必须自己释放
普通变量的内存是系统自己分配 所以系统自己负责释放

char *pName = malloc(3 * sizeof(char));
    //判断分配是否成
    if(pName == NULL){
        //分配失败
        exit(EXIT_FAILURE);
    }
    pName[0] = 'j';
    pName[1] = 'a';
    pName[2] = 'c';
   /* 当之前分配的内存空间不够了 就需要在之前的基础上重新分配
    realloc 必须是之前使用malloc分配过的
    如果是系统分配的内存 是不能使用realloc的
    用完了就要自己释放内存*/
   pName =  realloc(pName, 4*sizeof(char));
    pName[3] = 'k';
    printf("%s\n", pName);
    free(pName);
    return 0;
   }

结构体:结构体 是一种数据类型 复合数据类型
结构体的初步使用

 //struct
    //声明一种类型 struct Person == int
    struct Person {
        char name[10];
        char *addr;
        int age;
    };

//    int i1 = 10;
//    struct Person zs = {"张三", 20};
    //定义结构体struct Person变量 变量名xw
    int i;
    i = 20;
    struct Person xw;
    //xw.name = "小王";//数组一旦定义 地址不能改变
                    //不能直接给数组赋值
    xw.name[0] = 'x';//系统为这个变量分配内存了
    xw.name[1] = 'w';
    
    //xw.addr = "西南大学";//常量字符串的地址是由系统分配的
    //先为addr分配内存
    xw.addr = malloc(4 * sizeof(char));
    xw.addr[0] = 'S';//字符指针赋值 必须要有内存
    xw.addr[1] = 'o';
    xw.addr[2] = 'u';
    xw.addr[3] = 't';
    
    xw.age = 30;

    printf("name:%s\n", xw.name);
    printf("addr:%s\n", xw.addr);

利用结构体编写一个小系统
定义结构体部分

typedef struct Node{
    char name[10];
    int _id;
    float score;
    struct Node *next;
} Student;

//初始化一个头结点
void initHeader(Student **pHeader){
    //动态分配内存
    Student *pTemp = malloc(1 * sizeof(Student));
    //初始化
    pTemp->next = NULL;
    //改变外部的值
    *pHeader = pTemp;
}

插入功能代码

void insert(Student *pTemp){
    //准备一个结构体 保存数据
    Student *pStu = malloc(1 * sizeof(Student));
    pStu->next = NULL;
    
    //提示用户输入
    printf("请输入姓名:");
    scanf("%s", pStu->name);
    printf("请输入成绩:");
    scanf("%f", &(pStu->score));
    
    //插入
    int count = 0;
    while (pTemp -> next != NULL) {
        pTemp = pTemp->next;
        count++;
    }
    
    //自动编号
    pStu->_id = count+1;
    
    //将当前这个学生添加到最后一个节点就可以了
    pTemp->next = pStu;
}

void querry(Student *pTemp){
    //指向第一个数据节点
    pTemp = pTemp -> next;
    while (pTemp != NULL ) {
        printf("id:%d\n", pTemp->_id);
        printf("name:%s\n", pTemp->name);
        printf("score:%.1f\n",pTemp->score);
        printf("\n");
        
        pTemp = pTemp->next;
    }
}

感悟:
指针是c语言的灵魂,因此学好指针是真的很重要,通过学习也感受到了指针的运用难度,还有他的一些重大作用。结构体是复合数据类型,所以判断它的占有内存是真的有难度。结构体的运用也是令人望而生畏,有些力不从心的感觉,链表真的是只懂一丝,总之努力就对了。

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • #mark- 01-指针和数组 //问题:指针类型的用途是什么? 答: 第一个用途, 取值的时候, 会根据指针类型...
    飞飞喵阅读 4,312评论 0 2
  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 13,907评论 1 32
  • 指针是C语言中广泛使用的一种数据类型。 运用指针编程是C语言最主要的风格之一。利用指针变量可以表示各种数据结构; ...
    朱森阅读 8,848评论 3 44
  • 最全的iOS面试题及答案 iOS面试小贴士 ———————————————回答好下面的足够了-----------...
    zweic阅读 7,643评论 0 73
  • 自己在几个自媒体平台写的都是一些目的性很强的文章,本身自己是做生意的,所以在写这些文章的时候都表现的很功利。当然...
    引力杂志阅读 1,697评论 0 0

友情链接更多精彩内容