指针基础入门级教程

目录

一、内存地址

二:大小端的存储模式

三:指针变量的基本概念

四:指针函数:

五:改变了指针变量的指向

六:定义一个指针变量保存数组元素的地址

七:强转 (要强转的类型)(表达式)

八:常量字符串


一、内存地址

(1)内存地址:在计算机科学中,内存中每个用于数据存取的基本单位,都被赋予一个唯一的序号,称为地址,也叫作内存地址。(可以理解成内存是一个城市,内存地址就是这个城市中的每个房子的具体位置)
在VS中每一个内存编号的大小都是4字节(所有的编号大小都是4字节)
(2)地址:就是内存中的地址编号
如:

int a = 10;  printf("%p\n", &a);


'&'是取址符,这里的&a是取变量a的地址,以%p的格式输出地址
(3)指针:为了方便访问内存中的内容,给每一个内存单元一个编号。(可以通过指针保存的地址,找到变量)

二:大小端的存储模式


(1)大端存储模式:是指一个数据的低位字节序的内容放在高地址处,高位字节序的内容存放在低地址处
(2)小端储存模式:是指一个数据的低位字节序的内容放在低地址处,高位字节序的内容存放在高地址处
比如:1234,4是低字节序放在低地址处,1是高字节序放在高地址处,所以是小端存储模式,反之则是大端存储模式
可以这样记忆:小端存储模式:小端不比大端记忆高,小端权利小所以只能循规蹈矩,低的放在低的,高的放在高的
而大端存储模式:大端权利大,所以可以打破规则,低位可以放在高位,高位也可以放在低位
vs中保存数据是小端存储模式
文件窗户打的红点叫做断点
一个16进制数:4的二进制,  两个二进制数,就是一个字节

三:指针变量的基本概念


c语言中有一类变量是专门用来存储(指向)地址的,我们将它称为“指针变量”,指针变量中存储的地址可以改变,也就是可以
改变指针变量的指向。

(1)指针变量是一个变量,不过保存的是地址
(2)指针变量的定义格式:数据类型*标识符
(3)数据类型:指针变量保存的地址的变量的类型(基类型)
(4)标识符:指针变量的名字

(5)指针变量的定义:定义指针变量的一般格式:类型名*指针变量名;
例如:

int * p, *q; char *p1;


注意:左端的int、char等是在定义指针变量时必须指定的“基类型”。
指针变量的基类型用来规定此指针变量可以指向的变量的类型;

int *p = NULL;//只定义不赋值的指针变量我们称为野指针,所以我们给指针变量P赋值一个空NULL,目的就是防止野指针的出现
//野指针是不安全的,因为如果我们对指针变量定义却ding 不赋值,那么指针变量就不知道指向谁,存储谁的地址了,那么系统就会
//给分配一个默认的地址,万一给分配的地址是系统的地址,在我们编写代码的时候,很容易改变系统,并且,重启很有可能救不活
// 一般这个时候我们就要重做系统了,但是重做系统的话,会丢失掉很多数据,所以是不安全的
p的类型是int*类型

p = &a;
printf("变量a的地址%p\n", p);//%p是地址的占位符

char*p1 = &ch;//定义指针变量p1,接着,把变量ch的地址给p1,不是*p1,


p1用来存储变量的地址,*是解引用符号,[]也是解引用符号,可以理解为找地址,*p1找到p1存放的变量的地址,就可以代替,
所以*p1也可以当做ch变量使用
 

p = &ch//类型不兼容  &ch  ch-->char  &char-->char*   保存的地址的类型是char*类型(基类型)

//使用指针变量  解引用  改变指针变量的指向
//解引用:相当于返回指针变量保存的地址上的元素   *指针名   *是解引用运算符  [ ]也是
 

int a = 10;
int *p = &a;
*p = 20;//p保存的是变量a的地址 *p(把p做解引用)相当于是变量,相当于是把20赋值给变量a
print

四:指针函数:

返回值为指针类型的函数称为“指针函数”
  如:

int*fun3(int *x, int *y)//fun3可以接收地址,这个地址上的元素是整形,fun3保存的地址是int*类型
{
      (*x) += y;
          printf("%d", ++(*x));
      return x;//返回指针变量x所指向的内存地址
  }
//这就是一个指针函数,返回值类型为整形int指针类型

五:改变了指针变量的指向

void fun(int *p1, char*p2)
{
    int age = 18
        p1 = &age;//改变了指针变量的指向   指针变量p1保存变量age的地址(指针变量p1指向变量age)
    *p1 = 20;//*p1相当于是变量a
    *p2 = 'a';
}

六:定义一个指针变量保存数组元素的地址

int *parr = NULL;
P = arr;
//p=p+4;//表达式p+1的值  p加的是一个p的基类型的大小,不是加的一个字节,加的是p保存的地址上的元素
//可以不改变p的指向 ,输出一个5  p+4可以表示&arr[4]
printf("%d\n", *p);


一维数组的首地址:可以使用数组名来表示 &arr[0] 或者arr


七:强转 (要强转的类型)(表达式)

八:常量字符串

不能修改常量字符串的内容

const char*p = "abcdefg";//指针变量p保存的是常量字符串的首地址
//*(p+2)='c';
//表示字符c的地址  *二级运算符


求这个字符串有多长
用strlen  而不是size of ,因为size of是算内存的大小,要算上反斜杠,而strlen 才是计算长度,不计算反斜杠0;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

翘指

创作不易,一分也是爱

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值