指针基础
//一:内存地址:在计算机科学中,内存中每个用于数据存取的基本单位,都被赋予一个唯一的序号,称为地址,也叫作内存地址 //(可以理解成内存是一个城市,内存地址就是这个城市中的每个房子的具***置) //在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;
#学习路径#