数据结构笔记 预备知识之指针

0.0 什么是指针


        对于初学者来说,常常不能准确认识指针,分不清指针和数组之间的区别,这在学习C语言过程中是灾难性的。因为指针是C语言的精髓,有些问题必须通过指针,才能有效进行处理。那到底指针是什么呢?我们来看看C语言之父Dennis M.Ritchie是怎么定义的,“A pointer is a variable that contains the address of a variable.”。可以看出,指针就是个变量,和C语言中的整型,字符型一样,只不过它的内容是地址。
        我们知道,声明一个int型的局部变量a,会在栈区获取4bit空间,a用来存放int型变量,如果不初始化,a的内容为随机值,同时声明一个指针p,会在获取4bit空间,p用来存放地址量,如果不初始化,p的内容为随机的地址量。但是如果不申请使用p内存放的地址量,进行*解引用是非法的。我们通过一段程序来说明,定义int型变量和指针变量,并都不进行初始化。
#include <stdio.h>

int main(int argc, const char *argv[])
{
	int a;
	int *p;

	printf("a = %#x,&a = %p\n",a,&a);
	printf("p = %p,&p = %p\n",p,&p);
	
	return 0;
}
运行结果为:


0.1 指针的定义


//指针的定义一
int a = 0x12345678;
int *p = &a;
上面的指针定义式,可以写成:
//指针的定义式二
int a = 0x12345678;
int *p;
p = &a;
两种定义式的意义是完全相同的,但是对于第一个定义式,初学者常常会感到困惑,其实它可以这样理解:
                                                                        int *  p = &a
即定义一个指针p,p里面就是变量a的地址。在这里,前面的*只是为了表示变量p是一个指针变量,不表示指针的解引用,并且int是表示指针p指向一个int型的变量。下面我们通过代码来说明指针p到底表示什么,及其大小。
#include <stdio.h>
 
int main(int argc, const char *argv[])
{
    int a = 0x12345678;
    int *p = &a;
    char ch = 'A';
    char *c = &ch;
 
    printf("a = %#x,&a = %p\n",a,&a);
    printf("p = %p,&p = %p\n",p,&p);
    printf("sizeof(p) = %d\n",sizeof(p));
    printf("\n");
    printf("ch = %c,&ch = %p\n",ch,&ch);
    printf("c = %p,&c = %p\n",c,&c);
    printf("sizeof(c) = %d\n",sizeof(c));
     
    return 0;
}
运行的结果为:
注:如无特殊说明,本专题的所有代码在Ubuntu12.04+gcc4.6.3环境下编译通过并成功运行。
这个运行结果中,刚好指针变量p的地址在变量a后面,指针变量c就没有在变量ch后面,也不存在相邻的关系。对于
怎样 存放变量是编译器自行决定的,并不存在指针变量和其所指向变量的存放位置关系。
上述指针的定义,我们可以用下图进行详细分析:

另外,指针变量的大小该如何理解呢?是否和其指向变量的类型有关?我们通过定义知道,指针是一个存放地址的变量,即不管指针指向什么类型的变量,它一直存放的都是其指向变量的地址值,所以指针的大小只和系统的地址总线有关,故在32位的系统中,sizeof(指针变量) = 4,因此,你可以像理解其他变量一样,在32位系统中,声明一个int型变量,就是在内存中拿4bit的空间,供该变量专用;声明一个char型变量,就是在内存中占1bit的空间,供该变量专用;指针变量也是这样,声明它,就是去拿4bit的空间,来专门存放地址。

0.2 指针与数组




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值