深入理解指针

内存结构

内存是由字节组成的
每个字节都有一个地址

地址就是指针

地址的别称就是指针

为什么地址就是指针?

因为地址有指向作用,通过这个地址可以找到某个字节空间,然后操作(读、写)字节空间,因为地址有指向作用,因此我们也称地址为指针。

举个例子:
称门牌号为指针,因为门牌号指向了某个房间,当然我们可以称自己家的地址为指针,因为我家的地址指向了我家,根据门牌号和地址的指向,可以找到某个房间和我家,带有指向作用的是指针。

指针:地址的外号&

变量空间开辟于内存

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里面存放的指针(数据)所指向的空间。

*的作用就是找到指针指向的空间。

*的两种用途

  1. 定义指针变量时使用,比如
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;
} 
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值