指针和数组
2015-06-22 12:23
218 查看
数组的本质
上一章节讲过了指针,那么数组是什么,数据类型是什么,为什么数组做函数参数的时候会退化为指针,怎么理解。先看一段代码:
int i,*p,a[] = {3,4,5,6,79}; p= a; for (i=0;i<=9;i++) { printf("%d\n",a[i])//通过数组名访问元素 printf("%d\n",*a+i)//也可以这样 printf("%d\n",p[i]//也可以这样 }
其实从程序上看数组和指针没有区别,数组从内存上是获取连续的内存区域进行数据存放,通过数组名获取了这块内存地址,所以数组名就是这块内存的代表,被定义为这块内存的首地址。数组名是一个地址,不可修改的常量,一个地址常量。数组名这个符号就是代表内存的首地址,本身就是这个地址。它是一个右值,不能放在=左边进行赋值,而指针是变量确实一个左值。
数组作为形参,在编译器当做指针来看,编译器从效率上将不提倡传入内存空间,但同时要操作一段内存空间,所以编译器默认的将数组名转化为指针,只是转化,传入的是数组地址而已。
多维数组和多级指针
在C语言中并不存在多维数组,从本质上讲是数组的数组,也就是数组的嵌套,各维之间有鲜明的层次关系。上一维把下一维看做作下一级数组,也就是数组的嵌套。#include <iostream> using namespace std; int main() { int c[4]={1,2,3,4}; int *a[4]; //指针数组 int (*b)[4]; //数组指针 b=&c;//数组指针指向数组的地址,用数组的地址进行初始化 //将数组c中元素赋给数组a for(int i=0;i<4;i++) { a[i]=&c[i];//指针数组,数组中存放的时指针,所以传入的内存地址 } //输出看下结果,两者的输出方式不同 cout<<*a[1]<<endl; //输出2就对 cout<<(*b)[2]<<endl; //输出3就对 return 0; }
View Code
重点讲解
数组和指针的区别定义一个数组的时候,需要在栈中静态分配一块内存,那么需要知道内存的大小,因为定义数组的时候需要确定各维的上限。数组是一个可以拥有内存,保存变量的数组类型,数组名代表地址。指针是一个存储内存地址的数据类型,定义一个指针需要知道它指向对象的类型,不需知道对象的大小。
字符串常量
字符串常量在c语言就是一个字符数组,尽管外部表现和数组不一样,实际上字符串常量本身就是数组的首地址,并且具有数组类型。sizeof(“abdaaff”)是 7而不是4。重点区别是字符串常量放在静态存储区,不允许改变;数组在栈中静态分配。
运算符&和*
&是取地址符,*是间接运算符。
&a的结果是一个指针,指针指向的类型就是a的类型加上。在运算中加上就是获取了指针指向的内存值。
版权声明:本文为博主原创文章,未经博主允许不得转载。
相关文章推荐
- 淮之北
- 输出以下图案
- windows下快速启动和停止服务
- 通过变量定义数组大小
- Android在View拉丝工艺和invalidate()和其他相关方法
- 日语学习之沪江N3基础 20150622 -1
- 为什么说计算机语言是相通的?
- C# - 推荐10本C#编程的最佳书籍
- c++使用流迭代器istream_iterator和ostream_iterator
- 仿QQ界面之搜索框
- C语言学习笔记(六)——其他编程知识
- Clean Code 读书笔记七
- List of RGBD datasets
- 单例设计模式
- 逻辑运算符和位运算符
- linux使用一个刚编译驱动方法
- 毕业面试笔记1
- 【温故知新】c#事件event
- LeetCode "Basic Calculator II"
- android中使用DisplayMetrics获取屏幕参数