c语言指针,数组
指针:说简单点就是一个地址。例如int *p,p是个变量,里面放的是地址0x0000,同理,每一个指针,不管什么类型,都是地址,也就是空间都是4个字节(32位机)。
以此类推,指针也有指向它的指针int **f,f是一个变量,它指向的是一个指针,f里面放的也是一个地址。也是4个字节。
而且记得放在=号的左右两边是不一样的表示。*p放在右边表示这个值,放在左边表示放这个值的那块空间。
永远记住,只有这个表达式可以表示空间的时候,才能放到左边。
例如说结构EX,typedef struct Node{int a,char b[10]}EX;
EX x={1,{1.,2,3}};
EX *p=&x;
p->b它不可以作为一个左值,因为他这个表达式的意思是表示数组的首地址,它是一个常量。就和数组名称不能做左值一样,因为他也是一个常量。
指针可以指向任何类型。
x=y;x的含义是x所代表的的地址,y的含义是有所代表的地址里面的内容。记住要将等号两边的整体的东西来看,p就是p,*p就是*p,不要缺少东西的看,因为他们表示的东西根本不同。
int a[100];当a作为右值时代表的是数组首元素的地址,和&a[0]一样,但是注意,这仅仅是代表,而没有一个地方来存储这个地址,也就是说编译器并没有为数组a分配一块内存来保存其地址,这一点与指针有很大差别。由此,可见a不能作为左值。编译器会认为数组名作为左值代表的意思是a的首元素的首地址,但是这个地址开始的一块内存是一个总体,我们只能访问数组的某个元素而无法把数组当做一个总体进行访问,我们可以把a[i]当做左值,但是无法把a当做左值。
1.最简单的,对常用变量取址
int a=100;int *p=&a;(int *p;p=&a)
2.指向数组的指针
int vector[10],*vp=vector;这个没什么问题,定义一个整型指针,指向数组的首地址(我们知道,数组名称也表示数组的首地址)
int matrix[3][10];*vp=matrix;这个是不对的,因为matrix不是一个指向整型的指针,它是一个指向整型数组的指针。int (*p)[10],这个表达式要这么理解,因为可以对p进行*操作,所以p肯定是指针,接下来执行下标引用,所以p指向的是某种类型的数组。由于p是指向一个整型数组的指针,所以p+1,p+2它每加一次是要根据10个整型值的长度进行调整。如果需要一个一个移动,那么就是int *p=matrix[0];int
*p=&matrix[0][0];
3.指针数组
int *api[10];这个先要进行下标操作,所以api是一个数组,又由于可以对数组元素做*操作,所以它的元素肯定是指针。所以他是指针数组。
数组:一个连续的空间放着一堆同样类型的东西。这一堆东西可以是任何类型,整型,字符型,指针等等。
我们对于连续的东西,有一个认识,只要知道了第一个的信息,后面的直接加,就可以知道了,所以关键的是表示第一个的信息。
这个时候数组的名字就发挥了作用,数组名可以表示第一个元素的位置,也可以表示本数组的首地址。(这两个概念有区别:别人举了个例子应该很形象&a[0],&a这两个值相同,但意义不同,一个是第一个元素的地址,一个是数组的首地址,就相当于湖南的省政府在长沙,长沙的市政府也在长沙,但代表的意义不同)。
指针和数组的关系
指针和数组没有任何关系。
指针就是指针,指针变量在32位系统下,永远占4个字节,其值为某一个内存的地址,指针可以指向任何地方,但是并不是任何地方你都能通过这个指针变量来访问到。
数组就是数组,其大小与元素的类型和个数有关,定义数组时必须指定其元素的类型和个数。数组可以存任何类型的数据,但是不能存函数。
指针的移动
一个类型为T的指针的移动,是以sizeof(T)为移动单位的。
int a[5]={1,2,3,4,5};&a+1取数组的首地址,该地址加上sizeof(a)的值,即&a+5*sizeof(int),也就是下一个数组的首地址,显然当前指针已经过了界。
*(a+1):a和&a的值是一样的,但是意思不一样,a是数组首元素的地址,也就是a[0]的地址,&a是数组的首地址,a+1是数组的下一个元素的地址,即a[1]的地址,&a+1是下一个数组的首地址。
c语言指针,数组的更多相关文章
- c语言指针数组与数组指针
一.指针数组和数组指针的内存布局初学者总是分不出指针数组与数组指针的区别.其实很好理解:指针数组:首先它是一个数组,数组的元素都是指针,数组占多少个字节由数组本身决定.它是“储存指针的数组”的简称.数 ...
- 【嵌入式开发】C语言 指针数组 多维数组
. 作者 : 万境绝尘 转载请注明出处 : http://blog.csdn.net/shulianghan/article/details/21402047 . 1. 地址算数运算示例 指针算数运算 ...
- C语言指针数组(每个元素都是指针)
转载:http://c.biancheng.net/cpp/html/3246.html 注意:数组指针的区别 如果一个数组中的所有元素保存的都是指针,那么我们就称它为指针数组.指针数组的定义形式一般 ...
- C语言 指针数组 多维数组
. 作者 : 万境绝尘 转载请注明出处 : http://blog.csdn.net/shulianghan/article/details/21402047 . 1. 地址算数运算示例 指针算数运算 ...
- c语言 指针数组
指针数组指针数组是数组,指针数组每个元素是一个指针指针数组的定义:type* parray[n]; type* 是数组中每个元素的类型parray 为数组名n为大小 例子:float* a[3] // ...
- C语言 指针数组指针
指向指针数组的指针. 1 #include <stdio.h> 2 3 int main(void) 4 { 5 char *pa[4]={"aaaaa"," ...
- c语言指针数组和结构体的指针
指向数组的指针,先初始化一个数组,使用传统方式遍历 void main() { ] = { ,,,, }; ; i < ; i++) { printf("%d,%x\n", ...
- C语言--指针数组大小
#include <stdio.h> #include <string.h> int main(void) { char *str[3]={ "Hello,thisi ...
- C语言指针【转】
一.C语言指针的概念 在计算机中,所有的数据都是存放在存储器中的.一般把存储器中的一个字节称为一个内存单元,不同的数据类型所占用的内存单元数不等,如整型量占2个单元,字符量占1个单元等,在前面已有详细 ...
- C语言入门---第九章 C语言指针
没学指针就是没学C语言! 指针是C语言的精华,也是C语言的难点. 所谓指针,也就是内存的地址,所谓指针变量,也就是保存了内存地址的变量.不过人们往往不会区分两者的概念,而是混淆在一起使用. ===== ...
随机推荐
- [深入学习C#]C#实现多线程的方法:线程(Thread类)和线程池(ThreadPool)
简介 使用线程的主要原因:应用程序中一些操作需要消耗一定的时间,比如对文件.数据库.网络的访问等等,而我们不希望用户一直等待到操作结束,而是在此同时可以进行一些其他的操作. 这就可以使用线程来实现. ...
- hbase_学习_00_资源帖
一.官方资料 1.官网:http://hbase.apache.org/ 2.官方文档:HBase 官方文档中文版 二.apache软件下载基地 1. Apache Software Foundati ...
- C++中抽象类和多继承
C++中没有java中接口的概念,但是可以使用抽象类来模拟java中的接口. 工程上的多继承 工程开发中的多继承几乎是不被使用的 多继承带来的代码的复杂性,远远大于其代码带来的便利性. 多继承对代码的 ...
- stl_heap.h
stl_heap.h // Filename: stl_heap.h // Comment By: 凝霜 // E-mail: mdl2009@vip.qq.com // Blog: http://b ...
- 搞事情 -- python之线程
简介 操作系统线程理论 线程概念的引入背景 线程的特点 进程和线程的关系 使用线程的实际场景 用户级线程和内核级线程(了解) 线程和python 理论知识 线程的创建Threading.Thread类 ...
- Unity中的ShaderToys——将大神们写的shader搬到unity中来吧
http://lib.csdn.net/article/unity3d/38699 这篇文章翻译自国外的一篇文章(这里是原文链接),正在使用unity的你是否在shader toy上发现很多牛逼哄哄的 ...
- ASP.NET AJAX(Atlas)和Anthem.NET——管中窥豹般小小比较
Anthem.NET近日有朋友和我提到Anthem.NET这个同样基于ASP.NET的Ajax框架,今天有机会亲自尝试了一下.初步的感觉似乎和ASP.NET AJAX不相上下,甚至某些地方要强于ASP ...
- MongoDB分析工具之一:explain()语句分析工具
explain(),语句分析工具 MongoDB 3.0之后,explain的返回与使用方法与之前版本有了很大的变化,介于3.0之后的优秀特色和我们目前所使用给的是3.0.7版本,本文仅针对Mongo ...
- Random获取不重复随机数
Random R = new Random(Guid.NewGuid().GetHashCode()); int i = R.Next(9999);
- Python模块-logging模块(二)
logging模块记录日志有四个主要类:logger,handler,formatter,filter logger提供了应用程序可以直接使用的接口,每个程序在输出信息之前都要获得一个Logger h ...