scanf遇到空格不能识别空格,遇到空格会中止
地址:每一块内存单元(1byte)的编号
如何取地址:取地址符 &变量名
打印地址:%p
通过解引用操作符(*),可以获取地址中存放的值
1.例析
#include<stdio.h>
int main()
{
int a = 20;
int* p = &a;
*p = 10;
printf("%p\n", p);
printf("%p\n", &a);
printf("%d\n", *p);
printf("%d\n", a);
return 0;
}
输出结果:
分析:
int* p:p是指针变量,定义指针变量需要在相关的数据类型后面加上*,此处的*并非是解引用操作符,仅仅是一种格式,并无实际意义,int则是指针变量p所指对象的数据类型,因为前面定义的a是int类型,所以该处是int*(整型),在其他场景下可以是double*(双精度型)、char*(字符类型)、float*(单精度型),按照具体情况而定
&a:&为取地址操作符,&a则是取出a的地址
int* p=&a;:这一步是取出a的地址(对应&a),并赋给指针变量p,如果此时打印指针变量p那么输出的结果就是a的地址(即第7、8行代码,输出结果第1、2行),如果要打印a的地址要么printf("%p\n", p);要么printf("%p\n", &a);但要注意一个有&一个没有&,p前面没有&是因为指针变量p指代的就是&a
*p=10;:此处的*是解引用操作符,目的是间接访问p的地址即a,并将a的大小改成10,再强调一下此处的*与int*中的“*”的意义不同,前者是解引用操作符,后者是一种语法形式,无实际意义
对地址解引用可以取到地址里面的值
*&scores<===>*0x7ffd726fe864<===>25.6
保存地址,使用赋值语句(数据类型 变量名=表达式)
保存地址的类型:指针类型
p是指针变量——(指针)
一个指针变量在内存中占有八个字节
在64位操作系统下,所有的指针类型的变量在内存中占有8个字节
在32位操作系统下,所有的指针类型的变量在内存中占有4个字节
如何查看变量的类型:将变量名去掉,剩下的就是他的类型
通过pp来获取score的值
*pp<==>*&p<==>p
指针:就是指针变量
指针变量:保存地址的变量
指针类型:也是一种数据类型,指针变量的类型
数组和指针:
int arr[60]={1,2,3,4,5,6};//声明并初始化了一个数组变量
//变量名:arr
//类型:int [6],占24个字节
&arr取得是数组变量的首地址
表示的含义不一样,&arr是整个数组的首地址,arr是数组中首元素的地址
指针是可以进行+-一个整数,称之为指针的偏移,+-的整数就是偏移量
每次+-的step是偏移step个元素
&arr[1]<====>arr+1 都代表数组中第二个元素的地址
&arr+1代表第二个元素的地址
二维数组:
任何指针变量开辟的空间大小都是8byte(64位操作系统)
数组指针:数组的指针
int arr[6]={1,2,3,4,5,6,}
int (*p)[6]=&arr
p的类型int(*)[6]
指针数组:指针的数组
int* p[6]=&arr
一维数组等价关系:
等价关系