⼀、C语⾔中的指针
与指针相关的概念
• 内存:程序和数据通常存储在硬盘上,他们会被持久保存。硬
盘可以存储很多东西,但其传输数据的速度较慢,所以需要在
运⾏程序或者打开数据时,这些数据必须从硬盘上传递到另⼀
种容量较⼩但速度很快的存储器上,之后才送⼊CPU执⾏处理。
这样的存储器就是内存。
• 内存地址:为了正确访问内存单元,每个内存单元都拥有⼀个
编号,这些编号是连续的,称作地址。编号对应的内存以字节
为单位划分。
内存地址的⼤⼩:内存地址的⼤⼩与操作系统的位数相关,32
位操作系统占4个字节,64位操作系统占8个字节。
⼆、指针变量的定义
• 指针变量:特指存储内存地址的变量,统称为指针变量或指针
• 指针变量的定义:
/*
int *指针变量的类型,表⽰整型指针
p为变量名
NULL为初始值,恒等于0
*/
int *p = NULL;
指针变量与基本类型变量定义⽅式的区别:为了区别于普通变
量的定义,*在变量定义的时候起到了修饰作⽤,修饰所定义的
变量p只能⽤于存储指针。
/*
为了防⽌出现如下的逗号表达式,导致变量的类型混乱,*与
变量名相邻
*/
三、与指针变量相关的运算符
取址运算符—&
/*
&:取址运算符,获取number变量对应内存单元的⾸地址,单⽬
运算
*/
int number = 5;
//获取number的地址赋值给指针变量p
int *p = &number;
printf("p -> %p\n", p);
p -> 0x7fff5fbff85c
取内容运算符—*
int number = 5, digital = 12;
int *p = &number;
//*为取内容运算符,等价于number变量,单⽬运算
printf("content -> %d\n", *p);
//为指针变量p赋值新的内存地址
p = &digital;
//为指针变量指向的存储空间赋值
*p = 200;
指针变量的重指向:将⼀个已定义的指针变量赋值为
另⼀个变量的⾸地址称之为指针变量的重指向
指针变量的算数运算
强调:指针不是类型,真正的类型是地址,指针(指针变量)
是指存储地址这种数据类型的数据的变量
• 例如:
int number = 5;
• 5是整数,⽽number是存储该整数的变量。指针就好⽐number
变量,⽽地址就如5这个整数。
指针能够进⾏算数运算本质原因在于算数运算是地址这种数据类
型的本能,正因为地址具有加减运算的能⼒,才使得指针作为存
放地址的变量也能够进⾏算数运算,如number++
• 指针变量的数据类型:指针变量的数据类型只限定了指针在参
与算数运算的时候⼀次偏移多少个字节,通过*取内容的时候
读取多少个字节 int number = 5;
int *p = &number;
四、指针变量与数组的关系
关于数组名
注意:数组名并不是指针
• ⽰例:
int array[10] = {0};
printf("array -> \t%p\n", array);
printf("&array -> \t%p\n", &array);
printf("array + 1 -> \t%p\n", array + 1);
printf("&array + 1 -> \t%p\n", &array + 1)
• 结果:
array -> 0x7fff5fbff840
&array -> 0x7fff5fbff840
array + 1 -> 0x7fff5fbff844
&array + 1 -> 0x7fff5fbff868
关于数组名
• 分析:
• array与&array指向同⼀个内存地址,但其通过算数运算后的结果不
同。array + 1偏移⼀个数据类型所占字节数(4个字节),&array +
1偏移整个array数组所占字节数(40个字节)
printf("%ld\n", sizeof(array));
• 这⾏代码会得到整个数组的内存⼤⼩,事实可以证明:&array获取的
是整个数组的⼤⼩。数组名取地址等价于对数组取地址。
• array与&array的结果都是取数组的⾸地址,但其数据类型不同;
• array表⽰&array[0],即表⽰数组⾸个元素的地址,array + 1表⽰数
组⾸地址 + sizeof(数组元素类型)。
• &array虽然值为数组⾸个元素的地址,但其数据类型实为:int (*)[10]
表⽰长度为10的⼀维整型数组指针类型,&array + 1表⽰数组⾸地址
+ 数组总⼤⼩。
注意:数组名是⼀个符号地址常量,不是变量,所以不能⾃增,⾃减
指针与数组
int array[10] = {0};
int *p = array;
• p指针保存数组的⾸地址
• *p、*(p + 1)、(*p) + 1分别为多少
• 被赋值为数组⾸地址的指针p可以被当作数组名来使⽤
• p[1] = 3;
• 等价于 array[1] = 3;
• 等价于 *(array + 1) = 3;
• 等价于 *(p + 1) = 3;
• 等价于 p[1] = 3;
四、指针与字符串
• C语⾔⽤⼀维字符数组来描述字符串的概念,故指针与字符串类似于
指针与数组的概念。
• 字符指针可以操作单个字符,也可以操作整个字符串。
string为数组名,同时也是⼀个代表数组⾸地址的地址常量
*/
char string[] = "lanou3g";
char *p = string;
//操作字符
*(p + 1) = 'A';
//操作字符串
printf("string: %s\n", p);
• %s格式控制符的作⽤:printf函数的格式串中如果包含%s格式控制
符,择需要对应⼀个指针,函数内部会循环对指针做移位运算来得到
每⼀个字符,知道遇到字符串的结束标志符’\0’结束。
网友评论