成为C++高手之指针与数组

指针初步

定义一个指针变量:int * a=NULL; int 是指针的类型,其实应该说是指针指向的数据的类型。

程序运行时,数据都是放在内存中的,既然在内存中,就处于内存中的某个位置,这就是数据的地址。指针中保存的就是这个地址。所以不论什么类型的指针,指针变量本身之间并没有区别,值都是一个整数值。32位程序中这个整数是32位的,64位程序中这个整数是64位的。其实指针变量与整型变量之间跟本没有区别,就看你怎么解释它了。一个整数你可以把它解释为指针也可以解释为整数,所以指针与整数之间可以轻松转换。

你完全可以定义指针时直接给它赋一个整数值,表示这个指针指向这个整数所代表的地址位置,而这个位置的数据如何去解释它呢?就看指针的类型了。但是一般我们不能这样做,这样容易崩溃,因为你随便指定的这个位置不是一个有效的位置。所以在使用指针之前要让指针指向一个有效的位置,比如 a=&b; b是一个int型变量。“&”是取得b的地址,此时a就指向了一个有效的地址。

使用指针所指向的数据,需要“*a”的方式,比如 *a=100; 这样看起来很像以间接的方式使用变量b。我们的计算器程序中用到的scanf()函数,其接收用户输入值的参数是一个指针,但这个指针必须指向有效的内存才能接收到数据,否则会引起崩溃。

要区分好指针与指针指向的数据之间的区别。指针本身占4个字节或8个字节,而指针指向的数据不一定占多少字节。比如指向一个char型数据,那么指针指向的内容只占一字节。指针也可能指向了一大块内存,比如用malloc在堆中申请的内存。

指针变量本身的销毁不影响指针指向内存,就是说它们俩的生命期是完全没关系的。一般指针都是临时变量(在栈中分配),如果指针指向的内存是堆中分配的话,当函数返回时指针变量会被自动销毁,而其指向的内存却没有被释放,那么那块内存就再也不能被释放了,于是它就成了内存漏洞。

指针与所指向内容的关系,如下:

这里写图片描述

中间红色是指针d的值,正好是变量a的首字节的地址,也就是a的地址。这是64位程序的情况,可以看到地址占了8个字节。

以上是VS中的样子,QtCreator中是这样的:

这里写图片描述

注意这个是两个程序,所以a在内存中的位置不一样,所以d的值不一样。

数组变量本身其实也是一个指针。但是编译器把它当数组对待,比如sizeof()计算一个指针时得到的是不是4就是8,而计算一个数组时,得到的是整个数组所占的字节数。而同时数组变量又完全可以当作指针使用。

关于指针的详细解释,请参考视频教程:http://edu.csdn.net/course/detail/2318

数组

数组是一坨类型相同的数据排列在一起组成的,因为每一个元素占用的字节数相同,所以跟据一个元素的序号就可以计算出它在内存中的位置,所以数组元素可以用序号来访问。

    //定义一个float型数组,数组的类型表示其每一项都是一个float型值
    //数组有19项,这个数组 占19x4 个字节。没有初始化,数组每一项的值都是随机值
    float farr[19];
    //没有在中括号中指定数组的数量,但对数组进行了初始化,从大括号中可以
    //数出数组的项数。
    float farr1[] = {55.3, 44.2, 5, 33.3};

为什么要用数组呢? 比如要写一个函数,求10个数的平均数,那么这个函数就要有10个参数。如果求100个数的平均数呢?难不成给它100个参数?这肯定不现实。我们如果把这一百个数放到数组中,然后把数组传给函数,那么只需要一个参数就够了。如下:

#include <stdio.h>

//前置声明
float average(int numbers[]);

//入口函数
int main(int argc, char *argv[])
{
    //定义一个数组,给10个元素
    int arr[] = {1,22,3,4,76,443,32,45,34,23};

    //调用求平均数函数
    float avg = average(arr);
    //打印平均值
    printf("%f\n",avg);

    return 0;
}

//求平均值函数,参数是一个数组
float average(int numbers[10]){
    //先求数组中各元素的和
    int he =numbers[0]+numbers[1]+numbers[2]+numbers[3]+
            numbers[4]+numbers[5]+numbers[6]+numbers[7]+
            numbers[8]+numbers[9];
    //求平均值 
    float ret = he/10.0f;

    //返回结果
    return ret;
}

上一篇:成为C++高手之最终版计算器
下一篇:成为C++高手之for循环

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值