数组名和指针的区别(小结)
专题7 数组和指针的应用
(c)int a[10]={1,2,3,4,5,6,7,8,9,10}; for(i=0;i<10;i++) printf(“%d”,*&a[i]); //该程序段实现将数组元素的值以整型数据形式输出
(2)通过数组名表示各个数组元素的地址
虽然数组名中的内容不能改变,但是可以通过加一个整数来表达数组 中不同数组元素的地址
1 3
5 7 9 11 13 15
17
19 21 23
这里的a[i]+1为一个数组元素所占的字节数(数组元素的基本类型),即 理解成移动一个存储单元(一个数组元素),+2表示移动两个存储单元。 依次类推。 如:int a[3][4],*p;
p=a[i]; //该赋值是合法的,4>i>=0
练习 1.设有如下程序的输出结果是: main() { int x[5]={2,4,6,8,10}, *p1, **p2; p1=x; p2=&p1; printf(“%d”,*(p1++)); printf(“%d”,**p2); } A)4 4 B)2 4 C)2 2 D) 4 6 2 、下列程序的输出结果是[C] A) 非法 B)a[4]的地址 C)5 D)3 main() { char a[10]={9,8,7,6,5,4,3,2,1,0},*p=a+5; printf(“%d”,*--p); }
数组与指针的关系解析
数组与指针的关系解析
数组与指针在C语言中有着密不可分的关系,理解数组与指针之间的关系对于编程人员来说至关重要。在C语言中,数组名实际上是数组首元素的内存地址,因此数组名可以看作是一个常量指针。
首先,我们需要明确数组名和指针的区别。数组名指向数组的首地址,而指针是一个变量,存储某个内存地址。在C语言中,数组名是一个常量指针,即不能被赋予新的地址值,而指针则可以指向不同的内存地址。
数组与指针之间的关系可以通过以下几点来解析:
1. 数组名即指针:在C语言中,数组名可以看作是一个指向数组首元素的常量指针。数组名本身就是一个地址常量,它存储的是数组首元素的内存地址。
2. 数组名的算术运算:由于数组名是一个指针常量,因此可以对数组名进行指针算术运算。例如,对数组名进行加法运算会导致数组名指向下一个元素的地址。这种特性使得我们可以通过指针运算来访问数组中的元素。
3. 数组名作为函数参数:在函数参数中,数组名会退化为指针,即数组名会被解释为指向数组首元素的指针。因此,在函数中传递数组参数时,实际上传递的是数组首元素的地址,而不是整个数组。
4. 数组和指针的区别:数组和指针虽然有联系,但是也有明显的区别。例如,数组名是常量指针,无法赋值新的地址,而指针是变量,可以指向不同的地址。另外,数组名和指针在内存布局上也有一些不同,数组在内存中是连续存储的,而指针可以指向非连续的内存地址。
总的来说,数组与指针在C语言中有着紧密的联系,理解数组与指针之间的关系对于编程人员来说至关重要。通过对数组名和指针的特性及区别的分析,我们可
浅谈数组和指针
,
浅 谈 数 组 和 指 针一 一 一 一 …删 柑 , 诖
0
叭i
越
出
姐
文/西 安外事学院计算机 中心 张丽 敏
一 个 变量 都有其存储地 址 ,一 个数 组 是 由若 干 元 素 组 成 的 , 而 其 中每 一 个 元 素 都 占据 了 一 定 的 内存 单 元 。 指 针 变 量 既 然 可 以指 向 变量 的地 址 , 那 么 就 可 以指 向整 个 数 组 在 内存 中存 储 的首 地 址 也 , 可 以指 向每一 个数组 元 素在 内存 中的存储位置 。 分别称 为“ 数组 指针 ” 与 “ 数组 元 素指 针 ” 。
f o r (__ 0 :i< 1 0 :i+ + )
( ㈣ p r in tf
“%d ” a .
:
p r in lf (“Ⅵ ” ):
通 过 以上 的介绍 ,我们知道 数组 与指 针 有 密 切 的联 系 . 它 们 在 编 程 语 言 中 占据 重要位置 。 0
参考书 目 [1]《c 语 言设计 》谭浩强 著 【2 ]《c 语 言程 序设计大全 》吴 宾 著
髓副觥弹翮㈨ 删_三 p rin
tf (“ % d
”
a
,
n]) :
‰p r in t f (“ kn ” ):
数组和指针的区别
数组和指针的区别
数组和指针是C语言中非常重要的两个概念,它们在编写程序时起着极其重要的作用。虽然它们在某种程度上非常相似,但它们之间也存在着很多的差异,下面我们就来分析一下它们的区别。
1. 定义方式
数组是由一组具有相同类型的数据元素所组成的有序集合,每个元素具有相同的数据类型,可以通过下标在数组中访问对应的元素。在C中,定义一个数组可以使用以下语句:```
int arr[10];
```
这个语句定义了一个名为arr的整型数组,这个数组有10个元素。
而指针是一个变量,它存放了一个内存地址,这个地址与它存储的数据类型有关。在C中,定义一个指针可以使用以下语句:
```
int *p;
```
这个语句定义了一个名为p的指针,这个指针指向一个整型变量。
2. 内存分配
数组在定义时要求需要一定的内存空间来存储数组元素,
因此在定义时就已经确定了内存空间的大小,且数组的大小不可改变。例如,如果定义一个大小为10的数组,则它的大小就是10,无论实际使用时需要存储的元素个数是多少,数组的大小都不会改变。
而指针在定义时只需要分配一个指针变量所需的内存空间,该指针可以在程序运行时动态地分配内存,因此指针所指向的内存空间大小不确定,需要在运行时根据需要动态地分配或释放空间。
3. 访问方式
在数组中,可以通过数组的下标来访问数组中具体的元素,下标从0开始,最大下标为数组大小减1。例如,访问arr数组中的第三个元素可以写成:arr[2]。
而对于指针,可以通过指针变量所指向的地址来访问该地址所对应的值。例如,访问p指针所指向地址上的整型变量可以写成:*p。
c语言中数组名a和a详细介绍
c语⾔中数组名a和a详细介绍
最近⼜把学习c语⾔提上⽇程上来了~~~先把我打算看的书都写下来吧,<C语⾔深度剖析>,<c和指针>系类,<c语⾔陷阱和缺陷>
1.是a和&a的本质,都是什么类型的。
2.从2维数组的⾓度看。
3.从指针运算的⾓度看。
声明:虽然数组名不是指针,但是⽤的很像指针,我们暂且把它叫做⼀个指针吧。
int a[10]; a ,&a和&a[0] 都是分别是什么?先说明a ,&a和&a[0]三个值是的相等哈。
a叫做数组名,是数组⾸元素的地址,也就是&a[0]的值。像是⼀个指针类型,是⼀个int型的指针类型,int *,先理解成指针吧。
&a这才是⼀个真正的指针,是⼀个数组指针。是数组的地址。
切记:&a不是指向指针的指针,因为&a和a的值相等,但是*&a和*a的值不相等。*&a和a的值⼀样,说明*&a仅仅是对这个数组指针进⾏了取值,取得的是数组的值,即数组⾸元素的地址,⽽不是对&a这个地址进⾏了取值。这个应该是c语⾔中针对数组指针运算的规定。
这⾥的数组指针&a取值之后,变成了a,是a,不是*a,变成了这个数组的数组名,或者说是数组⾸元素的地址。
复制代码代码如下:
#include<stdio.h>
int main()
{
int a[5]={1,2,3,4,5};
printf("a=%x\n",a);
printf("&a=%x\n",&a);
printf("*(int*)&a=%x\n",(*((int *)(&a))));
printf("*&a=%x\n",(*(*(&a))));
函数参数数组与指针的区别
函数参数数组与指针的区别
在C语言中,函数参数可以是数组类型或指针类型。它们之间的
主要区别在于数组参数在函数内部被看作一个本地的数组,而指针参
数在函数内部只是一个指向实际数组的地址。
对于数组参数,函数可以通过数组名获取数组的大小,但是数组
名无法修改。在函数内部,数组参数可以直接使用,而不需要使用指
针运算符。同时,对数组参数进行修改会改变实际数组的值。
相反,指针参数可以通过指针运算符进行操作,可以用来访问整
个数组或指向数组中的一个元素。但指针参数没有数组参数那样方便,因为它不提供数组大小信息,需要通过其他方法或额外参数获得。
总的来说,数组参数可以看作特殊的指针参数,它们在函数调用
时具有不同的语法和语义。如果函数需要使用数组的长度或修改实际
数组的值,则应使用数组参数;如果函数仅需要访问数组中的值,则
可以使用指针参数。
c语言笔试考试题及答案
c语言笔试考试题及答案C语言笔试考试题及答案
一、选择题(每题2分,共20分)
1. C语言中,以下哪个是合法的变量名?
A. 2variable
B. variable-name
C. variable_name
D. variable$name
答案:C
2. 下列哪个选项是C语言的关键字?
A. define
B. int
C. integer
D. float
答案:B
3. 以下哪个语句不能通过编译?
A. int a = 10;
B. int b = 10.5;
C. int c = 'a';
D. int d = 1.0;
答案:B
4. C语言中,以下哪个函数用于计算两个数的和?
A. pow()
B. sqrt()
C. sin()
D. sum()
答案:D(注意:sum()不是C语言标准库函数,这里假设它是一个自定义函数)
5. 以下哪个选项是正确的C语言数组声明?
A. int numbers[];
B. int numbers[10] = {};
C. int numbers = 10;
D. int [10] numbers;
答案:B
6. 以下哪个是C语言中正确的字符串字面量?
A. "Hello World"
B. 'Hello World'
C. "Hello\nWorld"
D. "Hello\"World"
答案:A
7. 在C语言中,以下哪个是正确的函数声明?
A. void myFunction();
B. int myFunction;
C. myFunction();
D. int myFunction()
答案:A
8. 下列哪个选项不是C语言的标准输入输出库函数?
指针与数组的关系综述
ma O i n { tja 】{O2 , , } p a i ,【 =1 , 3 4 , = ; ni 4 0 0 0
fr ; = ; + 0( i 3i ) O < +
p n ( [ 】%dn,a ] i f f” %d= \”,i; a i [) f (0< 3+) 0 j = + r= pit”( %d= \”j( j; r f a )%dn, a ) n( + j +)
C m ue K o l g n e h o g o p tr n we ea dT c n l y电脑 知 识 与技术 d o
Vo., .6 J n 01 ,P3 76 8 8 1 No 1 , u e2 1P .8 -3 7 7
指 针与 数组 的关系 综述
任正云
( 楚理 工 学 院 , 荆 湖北 荆 门 4 8 0 ) 4 0 0
(n c uUn e i f cn l y J g n 4 8 0 , hn ) 1 g h i rt o h oo ,i me 4 0 0 C i i v sy Te g n a
Abs r t r tac :F om n ra lm e tal dd es h sa tce i to uc st on e to h olm n a d esa o a r s.The a ar y ee n ld a r s,t i ril n r d e hec c p ft e c u d r s nd r w dd es n,t satce hi ril
C语言数组名及指向数组指针的小结
C语言数组名及指向数组指针的小结
C语言的数组名和对数组名取地址
转
自: /zdcsky123/article/details/6517811
相信不少的C语言初学者都知道,数组名相当于指针,指向数组的首地址,而函数名相当于函数指针,指向函数的入口地址。
现在有这样一个问题,如果对数组名取地址,那得到的会是什么呢?很多人立刻会想到:给指针取地址,就是指针的指针,即二级指针嘛!当然这样的结论是错误的,不然这篇笔记也就没有意义了。
下面我们来逐步分析,下面是一段验证这个问题的代码
Code:
1.#include<stdio.h>
2.int main()
3.{
4.int a[10];
5.
6.printf("a:/t%p/n", a);
7.printf("&a:/t%p/n", &a);
8.printf("a+1:/t%p/n", a+1);
9.printf("&a+1:/t%p/n", &a+1);
10.
11.return 0;
12.}
大家可以编译运行一下,我的输出的结果是:
Code:
1./*
2.a: 0012FF20
3.&a: 0012FF20
4.a+1: 0012FF24
5.&a+1: 0012FF48
6.*/
a和&a指向的是同一块地址,但他们+1后的效果不同,a+1是一个元素的内存大小(增加4),而&a+1增加的是整个数组的内存大小(增加40)。既a和&a的指向和&a[0]是相同的,但性质不同!
读到这里,有很多朋友已经明白其中的机制了,如果还是有些模糊,请继续往下看
Code:
1.int main()
【转】指针与数组的区别和联系
【转】指针与数组的区别和联系
⼀.指针与数组的联系:
指针与数组是C语⾔中很重要的两个概念,它们之间有着密切的关系,利⽤这种关系,可以增强处理数组的灵活性,加快运⾏速度,本⽂着重讨论指针与数组之间的联系及在编程中的应⽤。
1.指针与数组的关系
当⼀个指针变量被初始化成数组名时,就说该指针变量指向了数组。如:
1 char str[20], *ptr;
2
3 ptr=str;
ptr被置为数组str的第⼀个元素的地址,因为数组名就是该数组的⾸地址,也是数组第⼀个元素的地址。此时可以认为指针ptr就是数
组str(反之不成⽴),这样原来对数组的处理都可以⽤指针来实现。如对数组元素的访问,既可以⽤下标变量访问,也可以⽤指针访问。
2.指向数组元素的指针
若有如下定义:
int a[10], *pa;
pa=a;
则p=&a[0]是将数组第1个元素的地址赋给了指针变量p。
实际上,C语⾔中数组名就是数组的⾸地址,所以第⼀个元素的地址可以⽤两种⽅法获得:p=&a[0]或p=a。
这两种⽅法在形式上相像,其区别在于:pa是指针变量,a是数组名。值得注意的是:pa是⼀个可以变化的指针变量,⽽a是⼀个常数。因为数组⼀经被说明,数组的地址也就是固定的,因此a是不能变化的,不允许使⽤a++、++a或语句a+=10,⽽pa++、+
+pa、pa+=10则是正确的。由此可见,此时指针与数组融为⼀体。
3.指针与⼀维数组
理解指针与⼀维数组的关系,⾸先要了解在编译系统中,⼀维数组的存储组织形式和对数组元素的访问⽅法。
⼀维数组是⼀个线形表,它被存放在⼀⽚连续的内存单元中。C语⾔对数组的访问是通过数组名(数组的起始地址)加上相对于起始地址的相对量(由下标变量给出),得到要访问的数组元素的单元地址,然后再对计算出的单元地址的内容进⾏访问。通常把数据类型所占单元的字节个数称为扩⼤因⼦。
详解C++数组和数组名问题(指针、解引用)
详解C++数组和数组名问题(指针、解引⽤)
⽬录
⼀、指针
1.1指针变量和普通变量的区别
1.2为什么需要指针
1.3指针使⽤三部曲
⼆、整形、浮点型数组
2.1数组名其实是特殊的指针
2.2理解复杂的数组的声明
2.3数组名a、数组名取地址&a、数组⾸元素地址&a[0]、指向数组⾸元素的指针*p
2.4对数组名以及取值符&的理解
三、字符数组数组名
⼀、指针
1.1 指针变量和普通变量的区别
指针:指针的实质就是个变量,它跟普通变量没有任何本质区别。指针完整的应该叫指针变量,简称为指针。是指向的意思。指针本⾝是⼀个对象,同时指针⽆需在定义的时候赋值。
1.2 为什么需要指针
指针的出现是为了实现间接访问。在汇编中都有间接访问,其实就是CPU的寻址⽅式中的间接上。
间接访问(CPU的间接寻址)是CPU设计时决定的,这个决定了汇编语⾔必须能够实现问接寻⼜决定了汇编之上的C语⾔也必须实现简介寻址。
1.3 指针使⽤三部曲
三部曲:定义指针变量、关联指针变量、解引⽤
(1)当我们int *p定义⼀个指针变量p时,因为p是局部变量,所以也道循C语⾔局部变量的⼀般规律(定义局部变量并且未初始化,则值是随机的),所以此时p变量中存储的是⼀个随机的数字。
(2)此时如果我们解引⽤p,则相当于我们访问了这个随机数字为地址的内存空间。那这个空间到底能不能访问不知道(也许⾏也许不⾏),所以如果直接定义指针变量未绑定有效地址就去解引⽤⼏平必死⽆疑。
(3)定义⼀个指针变量,不经绑定有效地址就去解引⽤,就好象拿⼀个上了镗的枪随意转了⼏圈然后开了枪。
C语言中指针和数组区别的分析
程序 编译 时 。 给数 组分 配 内存 。 图 : 如
C l h l i l n I a I \ 0
20 00 +1 + 2 + 3 + 4 + 5 ……
标 准里并 没 有做更 细 的规 定 .许多 C语 言 书籍对
数 组 和指针何 时相 同、何 时不 同也 是 含糊 其辞 一 带而 过。 为了更 好地理 解 指着 与数组 , 这里 我们 谈谈 他们 在
it [O ] n 10; a
直接 地进 行操 作 , 不需 要 增加 指令取 得 具体 的地址 。 并 相反 ,对 于指 针 。它必 须首 先在 运行 时取 得 它 的 当前 值, 然后 才 能对 它进 行解 除操 作 。
立 口:c a p ” ia ; h r = Chn ” c p 3; 『1
从 上面 . 我们 可 以很 明显 地看 出 it c a 类 型不 二 、 组 和指 针的 相 同之处 n 和 hr 数 数组 和指 针 什么 时候相 同呢 ? 匹配 . 同理指针 和数 组两 种不 同类 型也 是 不 匹配 。
下 面我们 来谈 谈是 数组 与指针 的区别 : 1 针和数 组保 存数 据 的 内容 不 同 . 指 1 作 为函数 参数 的数组 名” 同于指针 . ” 等 r eC Po rm n a ga e 第 二 版 , e ga h rga migL n u g , K mi n& h
数组和指针
● 数组:数组是具有一定顺序关系的若干对象的集合体,组成数组的对象称为该数组的元素。
▲ 每个元素有n个下标的数组称为n维数组。
▲ a[100]:下标从0开始,到99止,不能为100。
▲ a[i][j]:i为行标,j为下标。
● 数组的声明:数组类型数组名[表达式1][表达式2]……
● 数组的使用:数组类型数组名[表达式1][表达式2]……
● 数组的存储:数组元素在内存中是顺序、连续存储的。
● 数组的初始化:就是在声明数组时给部分或全部元素赋初值。
▲ int a[3]={1,2,3}; 等价于 int[]{1,2,3};
▲ int a[5]={1,2,3}; //部分初始化,必须连续,不能间隔赋初值
▲ int a[2][3]={1,2,3,4,5,6}; 等价于 int a[][3]={1,2,3,4,5,6} //给出全部的初值时,行标可省
▲ int a[2][3]={{1,2},{3,4},{5,6}};
● 数组作为函数参数
▲ 使用数组名传递数据时,传递的是地址
▲ 使用数组名做函数的参数,则实参和形参都应该是数组名,且类型要相同
▲ 对形参数组的修改,也就是对实参数组的修改
▲ int ss(int a[][4],int bb) 调用:ss(b,x); //b是数组,x传递的是第一维的维数
● 对象数组
▲ 声明:类名数组名[下标表达式]
▲ 引用:数组名[下标].成员名
▲ 当一个数组中的元素对象被删除时,系统会调用析构函数来完成扫尾工作。
● 指针:是对地址直接操作的手段。动态内存分配和管理也离不开指针
C语言中指针与数组的区别
C语言中指针与数组的区别
C语言中指针与数组的区别
通俗理解数组指针和指针数组,C语言中指针与数组有什么区别呢?应该怎么去区分?下面是店铺为大家整理的C语言中指针与数组的区别,欢迎参考~
通俗理解数组指针和指针数组
数组指针:
eg:int( *arr)[10];
数组指针通俗理解就是这个数组作为指针,指向某一个变量。
指针数组:
eg:int*arr[10];
指针数组简言之就是存放指针的数组;
——数组并非指针&&指针并非数组
(1)定义一个外部变量:
eg:int value=10; int *p=&value;
举例:当需要在一个函数中用这个变量时:externa int*p;而非extern int p[];
分析:当用:extern int p[];这样的形式时,其实是:由于在定义这个变量的时候,是作为一个指针而定义的,则p指向的是 value的地址,当p当做一个数组被引入是,它其实存放的是value的地址,而并非指向value,导致调用出现错误。
(2)定义一个外部变量:
eg:int arr[10]={0};
举例:当需要在函数中引入这个外部变量时:extern int arr[10];而非extern int *arr;
分析:当用extern int *arr;这样的方式进行引入是,实际上这样是不对的,在定义这个变量的时候是作为一个整形数组来定义的,但是在声明的时候是用指针来声明的,通过数组声明可以访问到整个数组,但是通过指针实际上声明的指针并非指向数组,而是指向arr[10]
数组中首元素arr[0]地址的指针,导致访问出现问题。
指针与数组
1.2 二维数组的指针
1.二维数组的指针概念
在C语言中,一个二维数组可以看成是一 个一维数组,其中每个元素又是一个包含若干 元素的一维数组。
假如有定义:int a[2][3];
则C语言编译程序认为a数组是由a[0],a[1]两 个元素组成的一维数组,a[0]和a[1]分别是包含 三个元素的一维数组名,分别代表a数组元素的 起始地址(即a[0]是第0行元素的首地址, a[1]是 第1行元素的首地址)。因此,a和a[0]是两个基 类型不同的指针常量。
方法二:通过数组Leabharlann Baidu计算数组元素地址,找出元素的 值。
main() { int a[10]={54,65,8,2,3,56,8,21,57,98},i;
for(printf("\n"),i=0;i<10;i++) printf("%4d",*(a+i)); }
方法三:用指针变量指向数组元素
main() { int a[10]={54,65,8,2,3,56,8,21,57,98},*p,i;
p=a; for(printf("\n"),i=0;i<10;i++) printf("%4d",*p++); }
指针与数组
例如:int a[3][4],(*p)[4]; p=a;
p指向数组a的第1行,可以用行指针变量p表示数组元素 a[i][j]的三种形式:p[i][j]、*(*(p+i)+j) 和*(p[i]+j)。
• 要注意:p的值可修改,如p=p+1,后 指针p与a不再指向
同一行。
14
a[0] a[1] a[2] a[3]
a[4]
元素。
a[5]
▪ 2.指针相减运算
a[6]
• 两个指向同个数组的同类型指针作相减运
a[7]
算,其绝对值表示它们之间相隔的元素数 目。
p+92036
a[8] a[9]
▪ 3.指针之间作关系运算
• 两个相同类型指针可作关系运算比较指针
大小。例8.5程序循环控制是通过 p<a+6
for(i=0; i<6; i++ )
scanf("%d", &a[i] );
s=sum(a,6);
// 调用sum函数求数组元素的和
printf("s=%d\n",s);
retuen 0;
}
6
指针与数组
b
a
例 8.7 定义一个排序函数,完成对n个整数按从小到大排序。
5
b[0]
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
在Win 32 中:
1. (1) 对数组名进行sizeof运算时,结果是整个数组占用空间的大小;
(2) 但是数组作为函数参数时,对数组名进sizeof 运算,结果为4;
(2) 对指针进行sizeof运算得到的值是编译器分配给指针(也就是一个地址)的内存空间,即为4。
2. (1) 对数组名作&运算,得到的还是数组第一个元素的地址;
(2) 对指针取地址时得到的结果是指针所在的地址,也就是指向这个指针的指针,与指针的值不同。
BOOL mytest(char param[100])
{
//参数数组名:paramBytes
int paramBytes = sizeof(param);
printf("paramBytes \t%d\n",paramBytes);
//数组:mych1[]
char mych1[] = "abcdefg123"; //若定义为mych1[100]
int mych1Bytes = sizeof(mych1);
printf("mych1Bytes \t%d\n",mych1Bytes);//输出:100
//数组:mych[200]
char mych[200] = {0};
int myBytes = sizeof(mych);
printf("myBytes \t%d\n",myBytes);
printf("---addr \t%d\n",mych);
printf("---addr \t%d\n",&mych);
//指针:pch
char* pch = "12345abc";
int pchBytes = sizeof(pch);
printf("pchBytes \t%d\n",pchBytes);
//pch = mych;
printf("---addr \t%d\n",pch);
printf("---addr \t%d\n",&pch);
return TRUE;
}
运行: