指针详解(从基础到入门)

03-11 3681阅读 0评论

一、什么是指针

在计算机科学中,指针是编程语言中的一个对象,利用地址,它直接指向存在电脑储存器中另一个地方的值。由于通过地址能找到所需的变量单元,可以说,指针指向该变量单元。因此,将地址形象化地称为指针。意思是通过它能找到以它为地址的内存单元。从另外一个方面来讲,指针就是一个变量,用来存放内存单元的地址(编码),地址唯一标识一块内存空间。

可通过下面C代码来加以说明:

#include
int main()
{
    int a=10;//在内存中开辟一块空间
    int *p=&a;//取出a的地址,将a的地址存放在p变量中,p就是一个指针变量
    return 0;
}

ps:存放在指针中的值都被当做地址来处理,在32位平台上一个指针变量占4个字节,在64位平台上一个指针变量占8给字节

二、指针类型的意义

既然指针变量的大小是固定的,那么为什么还有各种指针类型呢?

1、指针类型决定了指针解进行引用操作时,能够访问空间的大小

下面举例说明:

当指针类型为字符型时,有以下C代码

指针详解(从基础到入门) 第1张

通过观察a的地址变化可知,对char类型的指针进行解引用操作并改变其对应的值时,可以改变两个字节内容(只能访问两个字节的空间)。

当指针类型为整形时,有以下C代码

指针详解(从基础到入门) 第2张

通过观察a的地址在内存中的变化可知,对int类型的指针进行解引用操作并改变其对应的值时,可以改变四个字节内容(可以访问四个字节的空间)。

总结:指针的类型决定了对指针进行解引用操作时有多大权限。比如,char *的指针解引用就只能访问一个字节,而int *的指针解引用能访问四个字节,double *的指针解引用就能访问八个字节。

2、指针的类型决定了指针加减整数的步长

观察以下C代码及其运行结果:

指针详解(从基础到入门) 第3张

我们不难发现,整形指针变量(pa)+1后,地址由C4跳跃到C8,向后跳跃了4个字节(一个整形);字符型指针变量(pc)+1后,地址由C4跳跃到C5,向后跳跃了1个字节(一个字符);类似的,double类型的指针变量+1后,地址应向后跳跃8个字节。

总结:指针类型决定了指针向前或向后走一步有多大(距离)。

可通过以下例题加深我们对其的理解

例题:已知数组int arr[10]={0},利用指针将数组元素全置为1

#include
int main()
    {
    int arr[10]={0};
    int* p=arr;//数组名表示首元素地址
    int i=0;
    for(i=0;i
        *(p+i)=1;//p为int类型的指针,每加一向后跳跃一个整形(4个字节)
    }
    for(i=0;i
        printf("%d ",arr[i]);
    }
    return 0;
    }

    int arr[10]={0};
    char* p=arr;//数组名表示首元素地址
    int i=0;
    for(i=0;i
        *(p+4*i)=1;//p为char类型的指针,每加一向后跳跃一个字符(1个字节),题设数组元素为整形(4个字节),应该加上4*i
    }
    for(i=0;i
        printf("%d ",arr[i]);
    }
    return 0;
    }

    int* p;//局部指针变量未初始化,默认为随机值
    *p=10;
    return 0;
}

   int arr[10]={ 0 };
   int* p=arr;//数组名代表首元素地址
   int i=0;
   for(i=0;i
       *(p++)=i;
       //数组元素个数为10,当i9时,指针指向的范围超过了数组arr的范围,此时p就是野指针
   }
   return 0;
}

    int a = 10;
    //a为局部变量,函数开始时创建,函数结束时销毁
    return &a;
}
int main()
{
    int* p = test();
    *p = 20;
    //此时p指向的空间已销毁(被释放),不属于当前程序,此时指针p就为野指针
    return 0;
}

    int i = 0;
    int j = 0;
    for (i = 0; i 

免责声明
1、本网站属于个人的非赢利性网站,转载的文章遵循原作者的版权声明。
2、本网站转载文章仅为传播更多信息之目的,凡在本网站出现的信息,均仅供参考。本网站将尽力确保所
提供信息的准确性及可靠性,但不保证信息的正确性和完整性,且不对因信息的不正确或遗漏导致的任何
损失或损害承担责任。
3、任何透过本网站网页而链接及得到的资讯、产品及服务,本网站概不负责,亦不负任何法律责任。
4、本网站所刊发、转载的文章,其版权均归原作者所有,如其他媒体、网站或个人从本网下载使用,请在
转载有关文章时务必尊重该文章的著作权,保留本网注明的“稿件来源”,并白负版权等法律责任。

手机扫描二维码访问

文章版权声明:除非注明,否则均为主机测评原创文章,转载或复制请以超链接形式并注明出处。

发表评论

快捷回复: 表情:
评论列表 (暂无评论,3681人围观)

还没有评论,来说两句吧...

目录[+]