C-指针与数组

指针与地址

指针是一种保存变量地址的变量。
通常的机器都有一系列连续编号或编址的存储单元,这些存储单元可以单个进行操作,也可以以连续成组的方式操纵。
指针是能够存放一个地址的一组存储单元。
声明一个指针
int *p
表明*p的结果是int类型。
指针只能指向某种特定类型的数据类型。
指向void类型的指针可以指向任何类型的指针,但是它不能间接引用自身。
一元运算符&可用于取一个对象的地址
p = &c
把c的地址赋值给p,称p为指向c的指针。
&只能应用于内存中的对象,即变量和数组。
一元运算符*是间接寻址或间接引用运算符
*p = 1
它作用于指针时,将访问指针所指向的对象。
 
 

指针和数组

通过数组下标所能完成的任何操作都可以通过指针来实现。
一般来说,使用指针比使用下标执行起来要快一些。

声明一个长度为10的整型数组
int a[10];
声明一个指向整型数据的指针
int *p;
将指针p指向数组的第0个元素
p = &a[0]
将指针p指向数组的第3个元素
p = &a[3]
将指针加n,就相当于指针的值加上了n个其指向数据类型的长度,即指向了内存中往下第n个连续的其指向类型的数据。n根据p指向对象的长度按比例缩放。
p + 1 等同于&a[4]
*(p + 1) 的值等于 a[4]
ps:
由于数组名所代表的是该数组最开始的一个元素的地址,所以
p = &a[0]; 等同于 p = a;
&a[i] 等同于 a + i
a[i] 等同于 *(a + i)
当把数组名传递给一个函数时,实际上传递的是该数组的第一个元素的地址。
 
 

比较指针的值

NULL用于赋给指针作为初始值,也可用常量0。指针可以和NULL进行比较。如:
p == 0 表示p的值为0,即为空指针。
如果两个指针指向相同数组中的元素,那么它们之间就可以进行比较,如:
p > q 表明p指向的数组元素的位置在q指向的数组元素位置之后。
如果两个指针指向相同数组中的元素,那么它们之间的减法就可以得出它们所指向的元素之间的元素数目,如:
p - q
 
 

字符串常量与指针

字符串常量是一个字符数组。以’\0’结尾。
当字符串常量作为参数传入函数时,实际上是传入了字符数组的第一个元素的地址,即指向该字符串常量的指针。
 
 

指针数组

int *pp[10];声明了一个包含10个整型指针的数组。
pp[3]是一个整型指针。
 
 

二维数组

int dd[5][10]; 声明了一个5行10列的二维数组。
二维数组的存储空间是连续分配的,一行接着一行。
按照行和列的下标来计算真正的内存地址。
因此在作为参数传递给函数时,必须指明列数,不然无法计算对应下标元素的内存地址。
 
 

指向函数的指针

int (a)(void , void *)
表明a时一个指向函数的指针,该函数具有两个void *类型的参数,返回值为int。
*a代表一个函数。
ps:
int *f(); 表明f是一个函数,返回一个int型指针。
int (*pf)();表明pf是一个函数的指针,返回一个int型对象。

猜你喜欢

转载自blog.csdn.net/qq_31730735/article/details/80720693
C-