指针的基本操作以及关于指针的注意事项

一. 指针的基本操作有:赋值(assignment),求值(value-finding)或取值(dereferencing),区指针地址,将一个整数家给指针,增加指针的值,从指针中减去一个整数,减小指针的值,求差值(Differencing),比较。

下面以一个例子进行说明:

 

#include<stdio.h>


int main(void)
{
	int *ptr1,*ptr2,*ptr3;
	int urn[5] = {100,200,300,400,500};

	ptr1 = urn;   //把一个地址赋给指针
	ptr2 = &urn[2];  //把一个地址赋给指针

	printf("ptr1 = %p,*ptr1 = %d,&ptr1 = %p\n",ptr1,*ptr1,&ptr1);
  //指针加法
	ptr3 = ptr1 +4; 
	printf("nadding an int to a pointer:\n");
	printf("ptr1 +4 = %p,*(ptr1 +3) = %d\n",ptr1+4,*(ptr1+3));

	ptr1++;  //递增指针
	printf("\n values after ptr++\n");
	printf("ptr1 = %p,*ptr1 = %d,&ptr1 = %p\n",ptr1,*ptr1,&ptr1);

	ptr2--;  //递减指针
    printf("\n values after ptr--\n");
	printf("ptr2 = %p,*ptr2 = %d,&ptr2 = %p\n",ptr2,*ptr2,&ptr2);

	--ptr1;   //恢复初始值
	++ptr2;
	printf("\npointers reset to original values:\n");
	printf("ptr1 = %p,ptr2 = %p",ptr1,ptr2);

	printf("\nsubstracting one pointer from another:\n");  //一个指针减去另一个指针
	printf("ptr2 = %p,ptr1 = %p,ptr2 -ptr1 = %d\n",&ptr2,ptr1,ptr2-ptr1);
	
	printf("\nsubstracting an int from another:\n");
	printf("ptr3 = %p,ptr3 -2 = %p\n",ptr3,ptr3-2);   //一个指针减去一个整数

	return 0;
}

 运行结果:

 

ptr1 = 0026FE5C,*ptr1 = 100,&ptr1 = 0026FE90

nadding an int to a pointer:

ptr1 +4 = 0026FE6C,*(ptr1 +3) = 400

 

 values after ptr++

ptr1 = 0026FE60,*ptr1 = 200,&ptr1 = 0026FE90

 

 values after ptr--

ptr2 = 0026FE60,*ptr2 = 200,&ptr2 = 0026FE84

 

pointers reset to original values:

ptr1 = 0026FE5C,ptr2 = 0026FE64

substracting one pointer from another:

ptr2 = 0026FE84,ptr1 = 0026FE5C,ptr2 -ptr1 = 2

 

substracting an int from another:

ptr3 = 0026FE6C,ptr3 -2 = 0026FE64

请按任意键继续. . .

 

二.指针的注意事项

1.不能对未初始化的指针取值(赋值)

  如:

int *pt;    //一个未初始化的指针

*pt = 5;  //一个可怕的错误

   这段代码的第二行把数值5存储在pt所指向的地址。但是由于pt未初始化,因此的的值是随机的,不知道5会被存储到什么位置。这个位置也许会对系统危害不大,但也许会覆盖程序

数据或者代码,甚至导致程序的崩溃。切记:当创建一个指针时,系统只分配了用来存储指针本身的内存空间,并不分配用来存储数据的内容空间。因此在使用指针之前,必须给它赋予一个

以分配的内存地址。比如,可把一个以存在的变量地址赋给指针,或者使用函数malloc()来首先分配内存。

 

 

 

 

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值