在今天看书的时候看到了一段代码,将指针变量的8种基本操作都包含进去了。

代码:

#include <stdio.h>
  int main()
{
	int urn[5]={100,200,300,400,500};
    int * ptr1,* ptr2,* ptr3;
    
    ptr1 = urn;
    ptr2 = &urn[2];
  
    printf("pointer value, dereferenced pointer ,pointer address::\n");
    printf("ptr1= %u ,*ptr1=%d ,&ptr1 =%u\n",ptr1,*ptr1,&ptr1);
    
    ptr3 = ptr1 + 4;
  	printf("\nadding an int to a pointer:\n");
  	printf("ptr1 +4 =%u, *(ptrl +4)=%d\n",ptr1 +4, *(ptr1 +4));
  	ptr1++;
  	printf("\nvalues after ptr1++:\n"); 
    printf("ptr1 =%u ,*ptr1=%d,&ptr1=%u\n",ptr1,*ptr1,&ptr1);
  	ptr2--;
  	printf("\nvalues after --ptr2:\n");
  	printf("ptr2 =%u ,*ptr2 = %d,&ptr2=%u\n",ptr2,*ptr2,&ptr2);
  	--ptr1;
  	++ptr2;
  	printf("\nPointers reset to original values:\n");
  	printf("ptr2 = %u,ptr1 =%u,ptr2-ptr1 =%td\n", ptr2,ptr1,ptr2-ptr1);
  	printf("\nsubtracting an int from a pointer:\n");
  	printf("ptr3 =%u,ptr3 - 2=%u\n",ptr3,ptr3 -2);
  
  	return 0;
}

输出的结果如图所示:alt

1.赋值
赋值可以将地址赋给指针比如用数组名、用带&的变量名或另一个指针。第七行将数组名赋给了ptr1(数组名是数组的首地址即a[0]的地址),第八行将urn[2]的地址赋给ptr2。要注意的一点是地址应该要和指针的类型兼容,如不能将double类型的地址赋给int类型的指针。

========================================================================

2.解引用

解引用符号为*,又称为取内容运算符,即取* p地址所对应的值,以植物大战僵尸为例。每一块地都相当于地址,而地上种的植物则为地址中的内容,* 就是要用这个内容。再回到例子中ptr1中的量就是urn的首地址,而* ptr1则是取ptr1地址(其地址为编号6487552)所指向的值为100,即值存在编号为6487552的地址上。

========================================================================

3.取址

和其他的变量一样,指针变量也拥有其自己的地址,而要知道指针变量的地址则需要使用&(&可以给出指针本身的地址),从11行的最后&prt1可以看出该指针变量的地址为编号6487544。因此&prt是指向ptr1的指针,ptr1是指向urn的指针。

========================================================================

4.指针与整数相加

用+将指针和整数相加,如指针+整数或者整数+指针,当这两者相加时整数会和指针所指向的类型相乘然后结果与初始地址相加得到一个新的地址,如13行的ptr1+4就等价于ptr[4]。相应的地址也就多了 4 * 4=16个字节,看跑完的程序第四行ptr1+4的地址编号为6487556,而加之前的ptr1地址编号为6487552,确实多了16个字节。由此可见成立。

========================================================================

5.递增指针

将指向数组的指针变量递增可以让该指针指向该数组的下个元素,本例的16行ptr1++就当于在ptr1的地址编号上加1 * 4个字节(其实就是相当于4. 中所说的与1相加)至于为什么是4是因为int类型一个占4个字节。所以第16行ptr1自增过后由原来的指向urn[0]到指向了urn[1],其地址编号由原来的6487552变为6487556,自然的原来ptr1取的是urn[0]的值在自增过后取的是urn[0]的下一个元素的值urn[1],则 * ptr由100变为了200.但是仍需注意的是ptr1本身的地址,即指向ptr1的指针是没有发生变化的还是用植物大战僵尸来理解,递增指针相当于改变了种植物的位置,位置发生了变化,所对应的植物也就是变化后位置上的植物,指向指针的指针就相当于戴夫的房子,它没有发生变化。

========================================================================

6.指针与整数相减

即上面第4条的逆过程。

========================================================================

7.递减指针

第5条的逆过程。

========================================================================

8.指针求差

第25行 ptr2-ptr1

可以求出两个指针的差值,一般的求差的两个指针分别指向同一个数组的两个不同的元素,通过计算来求出两个元素之间的距离。这个差值的单位与数组类型的单位相同,如25行ptr2-ptr1输出结果为2即:第三个元素urn[2]与第一个元素urn[0]的距离为2,这个2并不是2字节而是2个int首先要知道的是一个指针变量的字节为8b,urn[2]与urn[0]隔了一个urn[1]的地址(大小为8b),这8b刚好是两个int,则输出了2。