指针与数组的关系

指针与数组间关系紧密却一直没弄明晰,今天就来整理一下。

①定义中的内涵

当我们在定义数组时,必须要同时指定其类型和大小;而对于指针,则只需要指定其类型。

之所以数组需要指定大小,是因为系统会根据你所指定的大小为数组分配空间,例如int a[5],则数组得到sizeof(int)*5大小的存储空间(而且是连续的空间),不多不少。

而对于指针,系统只会为其分配空间,其指向地址并未分配,例如char *a,系统会为变量a分配空间,但*a(即a指向的地方)是随机的,系统不会为*a分配空间。这时候,你可以访问a或给a赋值,但却不可以访问*a或给*a赋值,因为要想使用*a,需要先使其指向有效区域,这可以通过动态申请内存或赋值(知道的有效地点)来实现。

对于指针,其自身变量和其所指向的地址皆可读写,但于数组而言,数组名就不能写,只能读了,因为指针自身变量分配有空间,而数组名没有。

②联系——数组名的种种

数组名就像是一个记录地址的标签,当

1 #include<stdio.h>
2 int main()
3 {
4     int a[5]={1,2,3,4,5};
5     int *b;
6     b=a;
7     printf("a[1]=%d\nb[1]=%d\n*(a+1)=%d\n*(b+1)=%d\n",a[1],b[1],*(a+1),*(b+1));
8     return 0;
9 } 

结果如下图:

不难看出a[1],b[1],*(a+1),*(b+1)四种表达方式都指向数组中第二个元素。

*在参考的博文中还看到这句话:“更悬一点:因为其在这儿所起的作用仅仅是个标签而已(编译的时候就是让两者相加),所以: 1[a],1[b],也是允许的。”即:

1 #include<stdio.h>
2 int main()
3 {
4     int a[5]={1,2,3,4,5};
5     int *b;
6     b=a;
7     printf("a[1]=%d\nb[1]=%d\n*(a+1)=%d\n*(b+1)=%d\n",1[a],1[b],*(a+1),*(b+1));
8 } 

运行结果同上不变。即在编译时,只是计算(a+1)或(b+1)。

【待续……】

时间: 2024-08-02 18:42:02

指针与数组的关系的相关文章

c/c++(疑3) C语言指针与数组之间关系

c/c++ (疑1)数组和指针 c/c++(疑2) const extern 有了前面 两篇 基础,下面我们可以更深入的来介绍c/c++(疑3) C语言指针与数组之间关系 1 概述(C语言指针与数组之间关系) 指针就是指针,指针变量在32 位系统下,永远占4 个byte,其值为某一个内存的地址.指针可以指向任何地方,但是不是任何地方你都能通过这个指针变量访问到. 数组就是数组,其大小与元素的类型和个数有关.定义数组时必须指定其元素的类型和个数.数组可以存任何类型的数据,但不能存函数. 2    

C/C++指针和数组的关系

首先一个列子说明指针和数组真的不是一回事: 浅谈C中的指针和数组(一) 如果用硬是把数组和指针放在一个,一个放声明里一个放定义中,这里就能看到指针和数组名是不同的.这篇文章从符号表的角度分析一下指针和数组名的不同点,两种东西在数据访问的时候的不同点. 有关不同点,再来点更深层次的东西: 浅谈C中的指针和数组(二) 接下来看看指针和数组名的相同点,但是有两点特例.也即是sizeof和&操作的时候,他们表现的对象是不同的. 浅谈C中的指针和数组(三) C/C++指针和数组的关系

c/c++ 函数、常量、指针和数组的关系梳理

压力才有动力,15年中旬就要准备实习,学习复习学习复习学习复习学习复习……无限循环中,好记性不如烂笔头……从数组开始,为主干. c 的array由一系列的类型相同的元素构成,数组声明包括数组元素个数和类型,c 中的数组参数是引用形式传参(传址调用),而常量标量是按值传递. //[]方括号表示声明的是数组,里面的数字表明了数组包含的元素数目 int states[50];//声明50个整数的数组 double code[365];//声明365个浮点数的数组 char chr[20];//声明20

C指针和数组的关系详解

1.C中数组和指针的关系 对于任意类型的数组arr,对于同类型的指针类型parr(确切一点,可以假设类型为int,即int arr[], *parr).它们之间有如下"内幕": 1.数组的名称arr本身就是一个指针,这个指针指向数组的第一个元素 2.因为名称arr本身是指针,所以可以直接赋值给同类型的指针parr:parr = arr,这使得parr也指向数组的第一个元素,所以这个赋值过程等价于parr = &arr[0] 3.指针和数组名在效果上是等价的.它们的区别在于:指针

什么是指针?什么是数组?指针和数组的关系?

形象地讲,我们可以把计算机的内存看作一条长街上的一排房屋,每个房间都可以容纳数据并通过一个房号来表识.而表示每个房间房号的值我们可以称为地址.或许这样的比喻有局限性,毕竟真实地计算机内存是以数以万计的bit位组成. ⑴初始化: ①最简单的以 int *p 为例,初始化时内存里开辟了四个字节的空间. ▇▇▇▇ ②另一个声明 ,现在,我们有两个变量,下图中显示了后面那个未知内容的内存. char ch = 'a': char cp = &a; ▇→▇▓←(?) (cp)      (ch) ⑵&quo

C语言学习笔记--指针和数组的关系

1.数组的本质 (1)数组是一段连续的内存空间 (2)数组的空间大小:sizeof(array_type)*array_size; (3)数组名可看做指向数组第一个元素的常量指针 (4)数组声明时编译器自动分配一片连续的内存空间 ,而指针声明时只分配了用于容纳地址值的 4 字节空间 2.指针的运算 (1)指针是一种特殊的变量,与整数的运算规则为: p + n == (unsigned int)p + n * sizeof(*p); 当指针 p 指向一个同类型的数组的元素时,p+1 指向当前元素的

指针和数组的关系

1.一维数组 Int  a[5]={1.2.3.4.5}: 1)( P=&a[0]和p=a等价) 在C语言中数组名就是该数组的首地址 2)printf("%d",a[1]); printf("%d",*(a+1)); 当我们以前使用a[1]的时候, 事实上计算机内部自动将其转换为*(a+1) 3) int a=[5]; int i,*p=a; for(i=0;i<5;i++,p++){ scanf("%d",p); } for(i=

黑马程序员-C语言基础:指针类型与指针和数组、字符串的关系

//指针变量就是用来存储地址的,只能存储地址 格式:  int  *p;  这个p为指针变量:指针变量占8个字节 类型是用来说明这个指针指向的类型: 比如上边的int代表这个指针变量会指向int类型的存储空间: int *p = &a;//这样一句可以写,此时的*只是一个标志,表示这个*只是表示p是个指针: *p = &a;//这样写就错了:此时*p表示取p指向的空间的值: 指针疑问:指针既然都占据8个字节,那么为什么要划分类型, 是因为当用*p指针取值或者赋值的时候,知道该取几个字节,比

指针与数组的区别和联系

转载: 一.指针与数组的联系: 指针与数组是C语言中很重要的两个概念,它们之间有着密切的关系,利用这种关系,可以增强处理数组的灵活性,加快运行速度,本文着重讨论指针与数组之间的联系及在编程中的应用. 1.指针与数组的关系 当一个指针变量被初始化成数组名时,就说该指针变量指向了数组.如: char str[20], *ptr; ptr=str; ptr被置为数组str的第一个元素的地址,因为数组名就是该数组的首地址,也是数组第一个元素的地址.此时可以认为指针ptr就是数组str(反之不成立),这样