指针的概念:一个变量的地址称为该变量的指针。如果有一个变量专门用来放其他变量的地址(指针),这个变量被称为“指针变量”。
指针就是内存地址,指针变量就是存储地址的变量。
代码示例:
#include <stdio.h>
int main()
{
int a = 5;
int *p;
p = &a;
printf("变量a的值是:%d, 变量a的地址是:%p\n",a,&a);
printf("变量p的值是:%p, 变量p的地址是:%p\n",p,&p);
printf("变量p指向a的值是:%d, 变量p所占空间大小是:%d个字节\n",*p,sizeof(p));
return 0;
}
注意:
指针无论指向什么类型的数据类型,所占的空间大小都是8字节。
例题1:交换两个数x,y的值。
#include <stdio.h>
void swap(int *a,int *b)
{
int t;
t = *a;
*a = *b;
*b = t;
printf("*a=%d *b=%d\n",*a,*b);
}
int main()
{
int x = 5,y = 10;
printf("x=%d y=%d\n",x,y);
swap(&x,&y);
printf("x=%d y=%d\n",x,y);
return 0;
}
注释:以指针作形参,实参传递给形参的就是地址值,可以让形参指针影响实参。指针变量更多应用于函数形参,因为c语言是传值调用的,如果函数形参是指针类型的,函数调用时,函数实参就会是变量的地址,所以指针形参就可以指向主调函数中的变量,再利用间接运算符间接操作主函数中的变量。
指针变量的定义
定义指针变量的语法格式:
基类型 *变量名;
获取变量地址的语法格式:
&变量名;
指向void的指针,简称void指针。void*被称为万能指针。
void指针指向一块内存,却没有告诉程序该用何种方式来解释这块内存。因此,不能用这种类型的指针直接获取所指内存的内容,必须先转成合适的具体类型的指针才行。
若想声明一个可以接收任何类型指针参数的函数,可以将所需的参数设定为void*指针。
比如标准函数memset(),它被声明再头文件string.h中,其原型如下:
int a[10];
memset(a,0,10*sizeof(int));
空指针常量是一个值为0的整数常量表达式,在头文件stdlib.h以及其他头文件中,宏NULL被定义为空指针常量。在定义指针变量时,指针变量的值可以初始化为NULL,例如:
int *ptr =NULL;
空指针是其值为NULL的指针,所以ptr是空指针。空指针不指向任何空间,所以不能用间接运算符(*)取值。
定义变量时未初始化的指针,或指向的目标已销毁了的指针称为悬浮指针或野指针。在指针变量使用过程中应该避免使用悬浮指针。误用野指针,会导致程序奔溃。
指针的运算:
1、与整数进行加减运算(+、-、++、--)
指针与整数进行相加、相减运算,实际上是将指针进行上移、下移操作。
2、同类指针相减运算(-)
同类指针进行相减运算,其结果是两个指针的地址之差除以指针类型所占字节数。
3、同类指针关系运算(==、!=、<、>、<=、>=)
注意:指针定义时最好初始化;同类指针没有相加运算;对两个毫无关联的指针比较大小是没有意义的。
指针与一维数组:假设指针变量p指向了数组arr,若想引起一维数组中的元素,可以通过下列两种方式:p[下标] 或 *(p+下标)(p在首个数组单元时才能使用这种方法);