1.指针内存:
a.指针变量需要内存空间
b.指针占8个字节的内存空间,和指向的类型没有关系
c.指针变量只保存地址
char name[3]={};
printf("%lu\n",sizeof(name));
运行结果为:24(3*8)
3个元素,每个元素是指针类型
char*name="jack";
printf("%lu\n",sizeof(name));
运行结果:8
(name是指针类型)
2.指针的运算:
当对指针加或者减时,操作的是指针指向的元素占据的内存空间*数量
int a[5]={1,2,3,4,5};
printf("%d\n",a[0]);//访问第一个元素
printf("%d\n",*a);//*(数组的首地址 第一个元素的地址)
运行结果:1
1
int a[5]={1,10,23,23,99};
a[0]的地址为0x100
*(a+1)=*(0x100+1*4)=*(0x104);
3.数组的访问:
可以用指针访问数组,可以用数组访问指针
a.使用下标访问 a[0] a[1]
b.使用地址访问 *(a+0) *(a+1)
int*b b[1] == *(b+1)
inta[10] a[1] == *(a+1)
4.数组的内存分配:
a.定义数组时,必须指定元素个数,数组的内容空间由系统分配
不需要我们去释放,系统会释放掉。
5.指针的内存分配:
a.当定义时,只为指针变量分配了8个自己的内存空间(用于存储地址)
b.如果需要存数据,就必须为这个指针变量指向的区域分配内存空间
char*name = NULL;
scanf("%s",name);
printf("%s\n",name);
jack
运行失败:内存错了
改正:j a c k \0需要5个内存空间
6.分配内存:(#include<stdlib.h>)
a.malloc()——首次分配eg:mallo(需要多大*sizeof(类型))
b.realloc( , )——如果首次分配需要扩大或者缩小
分配到哪里,分配多少
c.free()——释放自己申请的内存空间
数组 (优势:使用时系统就分配好了内存空间 )
(劣势:元素个数不变)
指针 (优势:元素个数可变,不浪费空间)
(劣势:需要自己申请内存)
char name[20]={};
scanf("%s",name);
printf("%s",name);
输入:hi jack
运行结果为hi没有后面的jack