指针(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