成为C++高手之指针与数组
2016-05-15 10:08
281 查看
指针初步
定义一个指针变量: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循环
相关文章推荐
- 如何组织构建多文件 C 语言程序(二)
- 如何写好 C main 函数
- Lua和C语言的交互详解
- 关于C语言中参数的传值问题
- 简要对比C语言中三个用于退出进程的函数
- 深入C++中API的问题详解
- 基于C语言string函数的详解
- C语言中fchdir()函数和rewinddir()函数的使用详解
- C语言内存对齐实例详解
- C语言编程中统计输入的行数以及单词个数的方法
- C语言自动生成enum值和名字映射代码
- 使用C语言判断英文字符大小写的方法
- c语言实现的带通配符匹配算法
- C语言实现顺序表基本操作汇总
- C语言中进制知识汇总
- C语言中计算正弦的相关函数总结
- 使用C语言详解霍夫曼树数据结构
- C语言实现选择排序、冒泡排序和快速排序的代码示例
- 探讨C语言的那些小秘密之断言
- C语言实现BMP转换JPG的方法