c语言 指针与数组
关键概念:
1.多个不同类型的指针可以对应同一个地址;
2.(&p)则是这样一种运算,返回一个指针,该指针的值是当时声明p 时开辟的地址,指针的类型是p的类型对应的指针类型;
3.(*p)操作是这样一种运算,获取指针p的值(变量的地址)找到对应的变量的值-----返回以(p 的值作为地址)的那个空间的值。但是如果这个变量本身就是一个地址,那么(*p)获取的值也是一个指针;
4.在数组中,指针的&,*运算符比较特殊,与普通变量的指针并不相同;
5.数组名不是一个该数组的指针;
一维数组
#include<stdio.h>
#include<stdlib.h> void main(){
int arr[] = {,,,,};
//通过int *p = arr这个定义,首先要明确arr的类型是int *
int *p = arr;
//c语言定义:当一个数组标识符出现在表达式中,
//①这个标识符的类型就从“某种类型t的数组”转换成“指向类型t的指针”,
//而且它的值就等于数组第一个元素的地址。并且这个指针是个常量指针,不可改变其值的。
//以上的叙述很官方,但是大家对①这个描述并不是很清楚,我以一维数组arr为例来解释一下
//“某种类型t的数组”指的就是数组arr[5],“指向类型t的指针”指的是数组第一个元素arr[0],
//通俗解释就是这样子的,②当一个arr出现在表达式中,arr所代表的就是数组第一个元素的指针,
//②同样适用于多维数组,这个具体讲解将会在二维数组中详细介绍。
//在本例子中,arr就是arr[0]的指针。 //有了以上的基础,我们来讨论一下arr+1,&arr+1
//打印出数组arr中所有的元素和他们的地址
for (int i = ; i < ; i++)
{
printf("%5d--%7x",arr[i],&arr[i]);
}
printf("\n");
//下面我们来分析arr+1的值,通过②,我们可以知道arr的类型是整型指针,
//假设arr的地址是0x87f904,那么arr+1的地址就是在arr的值(指针的值是一个地址,以前文章有说明)上加上4个字节(char型1字节,int型4字节)
//所以根据分析arr+1的地址应该是0x87f908
printf("\narr=%x,arr + 1=%x", arr, arr + );
//以上代码的结果证明我的分析是正确的
//现在对关键概念4做第一个证明,
//对&arr做一个解释
printf("\narr=%x,&arr=%x", arr, &arr);
//通过以上代码,我们发现arr和&arr的地址完全相同,
//但是实际上&arr(为什么说&arr是一个指针,请参照关键概念2)的指针类型和arr的指针类型却完全不同
//&arr返回的是arr数组的指针,&arr指针的类型是int(*)[5],
//为此我们可以通过sizeof()运算符来查看&arr指针的类型
//sizeof(*(&arr)),在这里我要解释一下,为什么不是sizeof(&arr)
//根据关键概念2我们可以知道&arr本身是一个指针,sizeof(指针),那么大小一定是4个字节
//我们要看一个指针的类型,还可以通过指针对应变量的类型来判断
//所以用*(&arr)获取&arr这个指针对应的变量
//*(&arr)又可以写成arr,所以sizeof(*(&arr))=sizeof(arr)
//所以有些资料上会这么说“sizeof(数组名)返回的是整个数组的大小”,
printf("\nsizeof(*(&arr))=%d,sizeof(arr)=%d", sizeof(*(&arr)), sizeof(arr));
//结果显示sizeof(*(&arr))=20,正好是一个数组arr的大小
//理解完&arr的本质后,我们在对&arr做加减运算就容易理解了,&arr+1,那么指针移动的单位是20个字节
printf("\n&arr+1的地址=%x", &arr+);
//以上代码证明我的结论 printf("\n");
system("pause"); }
运行结果截图:

二维数组
#include<stdio.h>
#include<stdlib.h> void main(){
//对于二位数组,我们主要需要理解arr,*arr,&arr三个指针的区别
int arr[][] = {};
//为二维数组赋值
for (int i = ; i < ; i++)
{
for (int j = ; j < ; j++)
{
printf("%5d,%7x", arr[i][j] = i * + j, &arr[i][j]);
}
printf("\n");
}
//判断一个指针的类型,可以通过*运算符求指针对应变量的大小来判断
printf("\n*arr==%d", sizeof(*(*arr))); //打印 4
printf("\n&arr==%d", sizeof(*(&arr))); //打印 48
printf("\narr==%d", sizeof(*arr)); //打印 16
//由以上结果推断*arr是整型指针,&arr是二维数组指针,arr是一维数组指针(即行指针)
printf("\n%d", *(*arr));//打印 0
//以上结果表明*arr是a[0][0]的指针,说明其*arr是一个列指针
//arr[0][1]=*(*arr+1)
//因为arr是一维数组指针,那么a[1][0]的指针是*(arr+1)
//a[1][0]的指针是*(arr+1)+1
//a[1][0]=*(*(arr+1)+1); //再次,我们要更深入一步,用指针来获取二维数组的值
int x = , y = ;
//如何获取a[x][y]的值
//通俗的说法,就是第几行的第几个的值
//首先行的地址指针是arr+x,这里arr+x是一个行指针,但是我们获取的最终的值其实是列指针的值,
//*(arr+x)这就是arr[x][0]这个整型变量的指针
//y=2说明列指针向后移动2个单位(8个字节),所以*(arr+x)+2就是arr[x][y]的指针
//求指针对应变量的值,用*运算符,
//最终结果是*(*(arr+x)+y)==arr[x][y]
printf("\n*(*(arr+x)+y)=%d,arr[x][y]=%d", *(*(arr + x) + y), arr[x][y]);
//因为*(arr + x)可以简写成arr[y]
//所以*(*(arr + x) + y)=*(arr[y] + y) printf("\n");
system("pause");
}
c语言 指针与数组的更多相关文章
- C语言指针和数组知识总结(上)
C语言指针和数组知识总结(上) 一.指针的基础 1.C语言中,变量的值能够通过指针来改变,打印指针的语句符号可以是: %08x 2.指针的本质 指针的本质就是变量,那么既然是变量,那么一定会分配地址 ...
- C语言指针与数组
C语言指针与数组 数组的下标应该从0还是1开始? 我提议的妥协方案是0.5,可惜他们未予认真考虑便一口回绝 -- Stan Kelly-Bootle 1. 数组并非指针 为什么很多人会认为指 ...
- C语言指针与数组的定义与声明易错分析
部分摘自<C语言深度解剖> 1.定义为数组,声明为指针 在文件1中定义: char a[100]; 在文件2中声明: extern char *a; //这样是错误的 这里的extern告 ...
- 11-C语言指针&一维数组&字符串
一.用指针遍历数组元素 1.最普通的遍历方式是用数组下标来遍历元素 1 // 定义一个int类型的数组 2 int a[4] = {1, 2, 3, 4}; 3 4 int i; 5 for (i = ...
- c语言指针,数组
指针:说简单点就是一个地址.例如int *p,p是个变量,里面放的是地址0x0000,同理,每一个指针,不管什么类型,都是地址,也就是空间都是4个字节(32位机). 以此类推,指针也有指向它的指针in ...
- C语言指针和数组
#include <stdio.h> int main() { /********************************************* * * 指针和数组: * 定义 ...
- C语言指针和数组知识总结(下)
一.数组指针: 数组指针就是一个指针,只不过它指向的是一个数组.可以通过如下方式来定义 typedef int Array[5]; //数组类型 Array* m; //数组定义 还有一种更 ...
- C语言核心之数组和指针详解
指针 相信大家对下面的代码不陌生: int i=2; int *p; p=&i;这是最简单的指针应用,也是最基本的用法.再来熟悉一下什么是指针:首先指针是一个变量,它保存的并不是平常的数据,而 ...
- 指针与数组的区别 —— 《C语言深度剖析》读书心得
原书很多已经写的很清楚很精炼了,我也无谓做无意义的搬运,仅把一些基础和一些我自己以前容易搞混的地方写一下. 1. 意义: 指针: 指针也是一种类型,长度为4字节,其存放的内容只能是一个地址(4字节). ...
随机推荐
- google不能访问的根本解决方法
最近中国的防火墙又调皮了.直接出现404了.以前通过IP访问的方式也失效了.难道这种问题能难倒我们这些做技术的IT工程师么?! 经过我的查询,我发现还是有大神在研究这块的.大神针对开发经常访问的网站做 ...
- MapReduce实例-NASA博客数据频度简单分析
环境: Hadoop1.x,CentOS6.5,三台虚拟机搭建的模拟分布式环境,gnuplot, 数据:http://ita.ee.lbl.gov/html/contrib/NASA-HTTP.htm ...
- mod_PHP&fastcgi
从宏观上来看,PHP内核的实现与世界上绝大多数的程序一样,接收输入数据, 做相应处理然后输出(返回)结果. 我们编写的代码就是PHP接收的输入数据,PHP内核对我们编写的代码进行解释和运算, 最后返回 ...
- 万能面试问题大全,教你怎么回答,怎么拿下offer
一.你对薪资的要求? 回答提示: 说实话,大家找工作,都希望找个高薪的,那我们如何和公司去谈薪酬呢?如果你对薪酬的要求太低,那显然贬低自己的能力:如果你对薪酬的要求太高,那又会显得你分量过重,公司受用 ...
- jqGrid 最常用的属性和事件,供平时参考(转)
[html] <html> ... <table id="list1"></table> <div id="pager1&quo ...
- x01.os.12: 在 windows 中写 OS
在 windows 中写操作系统,需要一系列的辅助工具.在此,要感谢川谷秀实!所有工具,都在 z_tools 文件夹中.有了大师的帮助,不妨也来尝试在 windows 中写一把 OS. 源代码及工具可 ...
- windows下制作linux U盘启动盘或者安装优盘(转)
windows下制作linux U盘启动盘或者安装优盘(转) Linux发行版排行榜:http://iso.linuxquestions.org/ [方案一]:UltraISO(不推荐,在Window ...
- 用U盘制作启动盘后空间变小的恢复方法,清除U盘启动盘空间
先把u盘插好,运行cmd, 输入diskpart,回车, (输入list disk,回车,能看到磁盘大致情况,u盘一般是磁盘1) 再输入select disk 1,回车, 再输入clean,回车, 关 ...
- STM32之USART库函数USART_SendData的bug
转载自:http://www.cnblogs.com/itloverhpu/p/3250537.html 1.最近在调试ATM32F103CB时发现,一串数据的最后一个字节总是发送不出去,用的是RS4 ...
- UVa 673 Parentheses Balance -SilverN
You are given a string consisting of parentheses () and []. A string of this type is said to be corr ...