美文网首页
C语言基础7

C语言基础7

作者: 克里斯里亚诺罗纳尔多 | 来源:发表于2016-07-23 15:40 被阅读22次

⼀、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’结束。

相关文章

网友评论

      本文标题:C语言基础7

      本文链接:https://www.haomeiwen.com/subject/bflwjttx.html