【C Prime Plus】学习笔记,Chapter 10,数组和指针之五

// 【C Prime Plus】学习笔记,Chapter 10,数组和指针之五
// 指针的赋值,加减运算
// Page 667

#include <stdio.h>

int main(void)
{
	int *ptr0,*ptr1,*ptr2;

     
	// 如果指针没有初始化,进行 ++ 运算,编译会warning使用了没有初始化的指针,但是不是严重错误
	 //ptr0++;

	// 如果没有初始化,就给指针所指的"地址"赋值,其实这个地址是不确定的,编译能通过,仅仅是警告,但是链接就显示这是严重错误的
	// 可能会覆盖其他的地址上的数据,或者直接导致程序崩溃
   //	*ptr0=5;



	int arn[5]={100,200,300,400,500};

	// (1) 给指针赋值,通常是数组名 或者 用&运算符取某个地址
	 ptr0 = arn;
	 ptr1 = &arn[1];
	 printf("指针ptr0的值(地址)是:%ld\n",ptr0);
	 printf("指针ptr1的值(地址)是:%ld\n",ptr1);
    
    // (2) * 运算,所谓的解指引, 就是取指针对应的值
	 int x = *ptr0;
	 
    // (3) &运算,就是取地址运算,可以取指针它自身的地址
	 printf("指针ptr0自身的地址是:%ld\n",&ptr0);

	 //  (4) 加整数N到指针上,这种算法实际就是移动N个单元,单元就是指针的所指的基本数据类型 
	 //   (减整数N也一样的意思,移动方向相反)
	 //   不论是指针是什么类型的,int,long,或double ,这里的N都必须是整数,因为指针作为地址,其值本质上unsigned int
	  ptr2=ptr0+2; // 找到ptr0的地址,然后向后移动2个单元.(不是移动ptr0哦,ptr0本身是没有改变的)
	  printf("指针ptr2的值(地址)是:%ld\n",ptr2);
	  printf("指针ptr2地址保存的值arn[2]:%ld\n",*ptr2);

	  // (5) 使用 ++ 或 -- 运算
	   ptr0++; // 这样改变了ptr0的指向
	   printf("指针ptr0的值(地址)是:%ld\n",ptr0);
	   printf("指针ptr0地址保存的值:%ld\n",*ptr0);

	   ptr0--;
	    printf("指针ptr0的值(地址)是:%ld\n",ptr0);
		printf("指针ptr0地址保存的值:%ld\n",*ptr0);

		//(6) 2个指针做差运算: 结果并非是想当然的十六进制的地址数值本身的差,而是指针的单元间距
		int y = ptr1-ptr2; //低位减高位
		printf("指针ptr1-ptr2的值(地址)是:%ld\n",y);  // 结果是-1,并非-4
		int z = ptr2-ptr1;  // 高位减低位
	    printf("指针ptr2-ptr1的值(地址)是:%ld\n",z);  // 结果是 1,并非 4

    


	//---
	return 0;

}


输出结果:

 

指针ptr0的值(地址)是:1245024
指针ptr1的值(地址)是:1245028
指针ptr0自身的地址是:1245052
指针ptr2的值(地址)是:1245032
指针ptr2地址保存的值arn[2]:300
指针ptr0的值(地址)是:1245028
指针ptr0地址保存的值:200
指针ptr0的值(地址)是:1245024
指针ptr0地址保存的值:100
指针ptr1-ptr2的值(地址)是:-1
指针ptr2-ptr1的值(地址)是:1

 


 

 

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