指针基础知识

指针的概念:一个变量的地址称为该变量的指针。如果有一个变量专门用来放其他变量的地址(指针),这个变量被称为“指针变量”。

指针就是内存地址,指针变量就是存储地址的变量

代码示例:

#include 

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 

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在首个数组单元时才能使用这种方法)

你可能感兴趣的:(c语言,算法)