学习C的第十一天

指针(2)

malloc()函数的使用

#include <stdio.h>
#include <malloc.h>

int main(void)
{
   int i = 5;
   int *P = (int *)malloc(4);

   return 0;
}

1.使用malloc函数,必须添加mallloc.h这个头文件。
2.malloc()函数只有一个形参,并且形参是整型
3.”4”表示请求系统所分配的字节数为4个。
4.malloc()函数返回第一个字节的地址。
5.p本身所占的内存是静态的(即由系统分配,由系统自动释放的)而p所指向的内存是动态分配的(可以由程序员手动分配,手动释放)
6.int * 表示构造的数组是什么类型的占几个字节。

由malloc()所构造的数组

int * pArr;
int len;
scanf("%d", len);
pArr = (int *)malloc(sizeof(int) * len);

pArr等价于&pArr[0],*(pArr+1)等价于pArr[1],一次类推。

#include <stdio.h>
#include <stdlib.h>

int main(void)
{
    int * pArr;
    int len;
    int i;

    printf("请输入你要输入的数字个数:\n");
    scanf("%d", &len);
    pArr = (int *)malloc(sizeof(int) * len);

    for (i=0; i<len; ++i)
        scanf("%d", &pArr[i]);

    printf("一位数组的内容是:\n");
    for (i=0; i<len; ++i)
        printf("%d\n", pArr[i]);

    return 0;
}

多级指针

int i; &i为int *类型
int * p; &p为int ** 类型
int * q &q为int **类型
int ***r

静态数组:

#include <stdio.h>
#include <malloc.h>

void f(int ** q)
{
    int i = 5;
    *q = &i;

}

int main(void)
{
    int * p;
    f(&p);
    printf("%d\n", *p);//本语句虽然没有语法错误但是又逻辑错误,此时i的内存已经被施放了不能被读取。

    return 0;
}

动态内存分配:

#include <stdio.h>
#include <malloc.h>

void f(int ** q)
{

    *q = (int *)malloc(sizeof(int));//*q 等价于p;
    **q = 5;//此时等价于*p=5;
}

int main(void)
{
    int * p;
    f(&p);
    printf("%d\n", *p);

    return 0;
}

结构体

/*通过函数对结构体 变量和输出。
*/
#include <stdio.h>
#include <string.h>

struct Student
{
    int age;
    char name[100];
    char sex;
};

void OutputStudent(struct Student *);

void InputStudent(struct Student *);

int main(void)
{
    struct Student st;

    InputStudent(&st);
    printf("%d %s %c\n", st.age, st.name, st.sex);
    OutputStudent(&st);


    return 0;
}

void InputStudent(struct Student * pst)
{ 
    pst->age = 25;
    (*pst).sex = 'F';
    strcpy(pst->name, "张三");

}

void OutputStudent(struct Student * pst)
{
    printf("%d %s %c\n", pst->age, pst->name, -pst->sex);
}

结构体的定义可以说是定义了一种新的数据类型。

结构体中的指针(地址)可以pst->age 来表示等价于(*pst).age 等价于st.age

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值