文章目录
- 内存结构
- 地址就是指针
- 为什么地址就是指针?
- 指针:地址的外号&
- 变量空间开辟于内存
- 1.所开辟的空间字节数>=1字节
- 2.变量的每个字节都一个地址
- 3.变量的第一个字节的地址代表整个变量的地址
- 4.如何使用变量的指针找到整个变量空间?
- 变量指针就是一个数
- 如何使用一个数据
- 一级指针与一级指针变量
- 什么是一级指针
- 什么是普通变量
- 普通变量指针的类型
- 使用指针访问变量空间
- 使用指针访问空间
- 如何找到a变量地址,然后读、写a变量地址
- 使用指针操作a变量空间
- *的两种用途
- 指针的好处
- 传递指针
- 传递普通数值与传递指针的异同
- 指针的含义
- 连续内存
- 内存单一
内存结构
内存是由字节组成的
每个字节都有一个地址
地址就是指针
地址的别称就是指针
为什么地址就是指针?
因为地址有指向作用,通过这个地址可以找到某个字节空间,然后操作(读、写)字节空间,因为地址有指向作用,因此我们也称地址为指针。
举个例子:
称门牌号为指针,因为门牌号指向了某个房间,当然我们可以称自己家的地址为指针,因为我家的地址指向了我家,根据门牌号和地址的指向,可以找到某个房间和我家,带有指向作用的是指针。
指针:地址的外号&
变量空间开辟于内存
1.所开辟的空间字节数>=1字节
比如
char型变量 1个字节
short型变量 2个字节
int型变量 4个字节
float型变量 4个字节
double型变量 4个字节
sizeof是运算符不是函数
2.变量的每个字节都一个地址
3.变量的第一个字节的地址代表整个变量的地址
即变量的指针就是变量第一个字节的地址
使用变量的地址(第一个字节的地址),找到相应的变量空间,进行操作,读或写变量空间
4.如何使用变量的指针找到整个变量空间?
a.通过变量指针找到变量的第一个字节
b.根据变量的类型得到变量所占的总的字节,从第一个字节往后数,找到变量空间所有字节
变量指针就是一个数
a. 指针这个数好比门牌号
指针就是一个数,只是这个数有点特殊,它是一个地址
门牌号是房间的地址,用来指向某个房间。
b. C语言采用什么方法得到一个变量的指针 ?
方法使用取地址符 &
int a;
&a //表示a变量的第一个地址,即a变量的指针。
printf("%p\n",&a); //16进制打印
提示: 打印一个变量的指针这个数时,可以采用%d方式打印,这也说明指针是一个比较特殊的整形数,但是你又不能说它是整形数,它是一个地址,我们也可以用%p,这个是地址专用的16进制打印形式打印结果
int a;
a指的是一个变量空间,我们可以向空间读写数据
&a指的是一个数,是变量a的指针,或者第一个字节的地址。
如何使用一个数据
a. 使用普通的整形数
直接使用
比如 printf("%d",10);
间接使用
先把这个数放到对应类型的变量中,通过使用变量来使用这个数
正常情况下,在不涉及类型转换时,我们要求将某个类型的数据,放到对应类型的变量中,要求类型必须保持一致
b.使用变量指针这个数
直接使用
int a=10;
printf("%d",&a);
间接使用
先把这个指针(数)放到一个变量中,然后通过这个变量使用这个数
存放指针这个数的变量就是指针变量。
int a=10;
printf("%d\n",&a);
int *p=&a;
printf("%d\n",p);
return 0;
一级指针与一级指针变量
什么是一级指针
a.指针:地址就是指针,指针是地址的别称,指针是一个数,是一个字节的门牌号(地址)。b.变量的指针:变量空间的第一个字节地址c.什么是一级指针所有普通变量的指针就是一级指针
什么是普通变量
只要在变量的声明或定义中,没有*的变量就是普通变量
例如:int a;
普通变量指针的类型
指针的等级:
一级:* 类型
二级:** 类型
三级:*** 类型
一般不会超过三级
一级指针表示指针指向一个普通变量
char a='a';&a; //普通变量a的指针,表示第一个字节的地址char*类型:char型一级指针类型,*表示一级,char表示这个指针指向的变量空间是一个char型变量空间
使用指针访问变量空间
使用指针访问空间
&a //一个数,表示a变量的第一个地址,即a变量的指针(门牌号)
int *pa;//表示定义一个整型的一级指针变量,用于存放整形一级指针(数)
int *pa=&a;
如何找到a变量地址,然后读、写a变量地址
1.直接通过变量名进行操作
写数据:a=100;
读数据:int b; b=a;
使用指针操作a变量空间
写数据
*pa=200; //等价于a=100
读数据
int b=*pa; //等价于int b=a;
此时,*pa代表的就是a变量空间,我们可以对其读写
这里的*找空间操作:找到指针变量pa里面存放的指针(数据)所指向的空间。
*的作用就是找到指针指向的空间。
*的两种用途
- 定义指针变量时使用,比如
int *pa; //定义一个int型的一级指针
*表示定义的是指针变量,一个*表示一级指针变量
2.访问空间时使用*
int a;
int *pa=&a;
*pa=100;//*找空间操作,找到pa这个指针变量里面放的指针所指向空间,*pa代表指针指向空间
指针的好处
int a=10;
int *pa=&a; //pa里面放的是a的门牌号a=100; //使用变量名a访问变量空间,写空间,把100写入
int b=a;//使用变量名a访问变量空间,读空间,将空间里面存放的数读出,赋值(写)给b*pa=200; //等价于a=200,*pa代表的就是a空间,然后对其进行写操作
b=*pa; //等价于b=a,*pa代表的就是a空间,然后从a空间读数据,写入b变量
传递指针
#include<stdio.h>void fun(int *pa,float *pb) {*pa=200;*pb=300.60;}
int main() {int a=10;float b=0.56;fun(&a,&b);printf("in main a=%d\n",a);printf("in main b=%f",b);return 0;
}
等价于
#include<stdio.h>
#include<string.h>void fun(int *pa,float *pb) {*pa=200;*pb=300.60;}int main() {int a=10;float b=0.56;
// fun(&a,&b);int *pa=&a;float *pb=&b;fun(pa,pb);printf("in main a=%d\n",a);printf("in main b=%f",b);return 0;
}
传递普通数值与传递指针的异同
(1)相同点
都是将实参的数赋值给形参变量。
(2)区别
前者传递的是一个普通的数,后者传递的是门牌号,即地址(指针),可以通过地址操作它指向的变量空间。
指针的含义
a.指针是一个数
指针是一个地址,变量的指针指的都是变量第一个字节的地址。
地址(指针)具备指向作用
b.指针变量
指针变量是一个变量,用来存放指针(地址),指针变量不具有指向作用,指针变量只是用来存放地址。指针变量因为存放地址才有了指向作用,指针变量存放的指针具有指针作用
指针和指针变量是两个不同的概念,只是约定俗成,习惯统一称为指针。
提示:
当一个指针变量里面存放指针这个数后,即这个指针变量指向了某个空间,但是你自己应该非常清楚,本质并不是指针变量指向某个空间,而是这个指针变量内存放的指针指向某个空间。
连续内存
//连续的动态分配
#include<stdio.h>
#include<stdlib.h>
int main(){
// int *p=(int *)malloc (5*sizeof(int));
// *(p+3)=3;
// printf("%d",*(p+3));int number;printf("input student number:");scanf("%d",&number);int *p=(int *)malloc (sizeof(int)*number);for(int i=0;i<number;i++){printf("input %d someone's grade:",i+1);
// scanf("%d",&p[i]);scanf("%d",p+i);} //输出for(int i=0;i<number;i++){printf("%d\t",p[i]);//*(stu+i) } printf("\n");return 0;
}
内存单一
//单一元素
#include<stdio.h>
#include<stdlib.h>
int main(){int *p=(int *)malloc(sizeof(int));*p=3;printf("%d",*p);return 0;
}