指针基础

//一:内存地址:在计算机科学中,内存中每个用于数据存取的基本单位,都被赋予一个唯一的序号,称为地址,也叫作内存地址
//(可以理解成内存是一个城市,内存地址就是这个城市中的每个房子的具***置)
//在VS中每一个内存编号的大小都是4字节(所有的编号大小都是4字节)
地址:就是内存中的地址编号
如int a = 10;  printf("%p\n", &a);
'&'是取址符,这里的&a是取变量a的地址,以%p的格式输出地址
指针:为了方便访问内存中的内容,给每一个内存单元一个编号。(可以通过指针保存的地址,找到变量)



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

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

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



指针变量的定义:定义指针变量的一般格式:类型名*指针变量名;
例如: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;
全部评论

相关推荐

巧克力1:双选会不如教室宣讲会
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务