数组名和指针的区别(小结)
c语言大期末考试题库及详解答案

c语言大期末考试题库及详解答案一、选择题1. C语言中,以下哪个关键字用于定义一个函数?A. intB. voidC. returnD. function答案:A2. 在C语言中,哪个运算符用于取模?A. /B. %C. *D. -答案:B3. 如果一个变量声明为 `int x;`,那么x的类型是什么?A. 浮点型B. 整型C. 字符型D. 双精度型答案:B4. 下列哪个选项是C语言中的合法标识符?A. 2variableB. variable2C. variable!2D. variable-2答案:B5. 在C语言中,以下哪个语句用于结束一个循环?A. continueB. breakC. returnD. exit答案:B二、填空题6. C语言中,一个基本的程序结构包括_____、_____和_____。
答案:预处理指令;函数定义;程序的主体7. 以下代码段的输出结果是_____。
```c#include <stdio.h>int main() {int a = 5, b = 10;printf("%d", a + b);return 0;}```答案:158. 在C语言中,若要定义一个字符数组来存储字符串"Hello",正确的声明方式是_____。
char str[] = "Hello";```答案:char str[6];9. 下列代码段中,变量x的最终值是_____。
```cint x = 10;x += x * x - 3 * x + 2;```答案:11210. C语言中,若要计算两个数的乘积,可以使用运算符_____。
答案:*三、简答题11. 解释C语言中指针的概念及其用途。
答案:指针是一种变量,它存储了另一个变量的内存地址。
指针用于访问和操作内存地址中的数据,可以实现动态内存分配、数组操作、函数参数传递等。
浅谈数组和指针

的地 址 。 设 i和j 以及 p 都 是 指 针 变量 , 用 它 们
指 向 有 关 元 素。 i的 出 值 为x , j 的 出 值 为
x + n 一 1 , 使 i与j交换就是 使a [1]与a 【j]交换
V o id
in v
(in t
’
×
in
t
,
n
)
J ( ) { / in t
te
m
p i.
0 3 7 9 6 7 5 4 2 ,
.
11
,
,
.
,
,
,
.
,:
( p r in t f
“the
o
r ig
in a
l
a
rra
y :kn
)”
:
f o r (i= 0 :i< 1 0 :i+ + )
( ㈤ p r in tf
% d “
”
,a
:
( p r in t f
) m “
”
.
in v
n
(a
10
.
):
p r in t f (“ T h e a r r a y h a s b e e n in v e rt e d :~n )”
—
p r in tf (“ t h e o r ig in a l a r r a y :~ ” ):
fo r (_- O:i< 1 0 :i+ + )
p
r in tf (“ % d
”
,a
[i])
p r in tf (“ Ⅵ ” ):
m a in ()
f 【 】={ } in t i a 1 0 ,
函数参数数组与指针的区别

函数参数数组与指针的区别
在C语言中,函数参数可以是数组类型或指针类型。
它们之间的
主要区别在于数组参数在函数内部被看作一个本地的数组,而指针参
数在函数内部只是一个指向实际数组的地址。
对于数组参数,函数可以通过数组名获取数组的大小,但是数组
名无法修改。
在函数内部,数组参数可以直接使用,而不需要使用指
针运算符。
同时,对数组参数进行修改会改变实际数组的值。
相反,指针参数可以通过指针运算符进行操作,可以用来访问整
个数组或指向数组中的一个元素。
但指针参数没有数组参数那样方便,因为它不提供数组大小信息,需要通过其他方法或额外参数获得。
总的来说,数组参数可以看作特殊的指针参数,它们在函数调用
时具有不同的语法和语义。
如果函数需要使用数组的长度或修改实际
数组的值,则应使用数组参数;如果函数仅需要访问数组中的值,则
可以使用指针参数。
C语言:指针的几种形式二

C语⾔:指针的⼏种形式⼆⼀、const指针1、const int* p和int const* p:两者意义是相同的。
指向的内容是只读数据,不可以q改变;但是指向的地址可以改变。
2、int* const p:必须先对指针初始化,⽽且指向的地址是只读的,不可以再被改变;但是指向的内容可以改变。
3、const int* const p:既不可以改变指针指向的地址,也不可以改变指针指向的内容。
⼆、指针数组:元素类型全是指针类型名称*数组名[数组长度]例如:char* pc[10]:字符指针数组,常⽤来可以表⽰⼀个字符串三、数组指针:指针指向数组名类型名称(*指针名)[数组长度]例如:int a[5] = {1,2,3,4,5};int (*temp)[5] = &a; //temp指向的是整个数组注意:1、定义指针时()不能丢掉,因为[]优先级⽐*⾼,若丢掉,就会变成指针数组。
例如:int *temp[4]//数组4个元素都是int*。
2、数组长度、元素类型必须与指针定义时给出的长度、类型相同。
四、函数指针数据类型(*指针变量名称)(形式参数列表)本质:函数放在代码区,函数指针指向代码区,通过函数指针可以访问代码区中的内容。
括号()不可以省。
例如:float (*p)(float a,float y):float类型指针函数float* p(float x,float y):函数p返回值为float指针类型五、总结数组与指针的区别:1、指针的本质是⼀个与地址相关的复合类型,它的值是数据存放的位置(地址);数组的本质则是⼀系列的变量。
2、数组名对应着(⽽不是指向)⼀块内存,其地址与容量在⽣命期内保持不变,只有数组的内容可以改变。
指针可以随时指向任意类型的内存块,它的特征是"可变",所以我们常⽤指针来操作动态内存。
3、当数组作为函数的参数进⾏传递时,该数组⾃动退化为同类型的指针。
CC++常见问题汇总

CC++常见问题汇总问题1、数组和指针的区别数组名不可以作为左值char * p1 = "Hello World" ; //分配字符串常量,然后赋给 p1 ,⼀个指针型变量,是左值char p2[ 20] = "Hello World" ; //分配⼀个数组,然后初始化为字符串,相当于⼀个常量,类型为数组,不是左值*p1 = 'h' ; //p1可以指向别的地⽅,但hello world不能更改p2[ 0] = 'h' ; //p2不能指向别的地⽅,但hello world可以更改si z eo f运算sizeof(指针变量p1)是编译器分配给指针(也就是⼀个地址)的内存空间。
sizeof(数组指针常量p2)是整个数组占⽤空间的⼤⼩。
但当数组作为函数参数进⾏传递时,数组就⾃动退化为同类型的指针。
取地址&运算对数组名取地址&运算,得到的还是数组第⼀个元素的地址对指针取地址&运算,得到的是指针所在的地址,也就是指向这个指针的指针。
因此main函数的参数char *argv[],也可以写成char **argv。
参考问题2、指针数组、数组指针与⼆维数组剖析定义指针数组:⾸先它是⼀个数组,数组的元素都是指针,数组占多少个字节由数组本⾝决定。
它是“储存指针的数组”的简称。
数组指针:⾸先它是⼀个指针,它指向⼀个数组。
在32 位系统下永远是占4 个字节,⾄于它指向的数组占多少字节,不知道。
它是“指向数组的指针”的简称。
实例区分int *p1[10]; //p1 是数组名,其包含10 个指向int 类型数据的指针,即指针数组int (*p2)[10]; //p2 是⼀个指针,它指向⼀个包含10 个int 类型数据的数组,即数组指针cout<<sizeof(a)<<""<<sizeof(b); //4 40实例分析符号优先级:()> [ ] > *p1 先与“[]”结合,构成⼀个数组的定义,数组名为p1,int *修饰的是数组的内容,即数组的每个元素。
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: 0012FF203.&a: 0012FF204.a+1: 0012FF245.&a+1: 0012FF486.*/a和&a指向的是同一块地址,但他们+1后的效果不同,a+1是一个元素的内存大小(增加4),而&a+1增加的是整个数组的内存大小(增加40)。
既a和&a的指向和&a[0]是相同的,但性质不同!读到这里,有很多朋友已经明白其中的机制了,如果还是有些模糊,请继续往下看Code:1.int main()2.{3.int a[10];4.printf("%d/n",sizeof(a));5.return 0;6.}这段代码会输出整个数组的内存大小,而不是首元素的大小,由此我们是否联系到,sizeof(a)这里的a和&a有些相同之处呢?!是的,没错,&a取都得是整个数组的地址!既数组名取地址等价于对数组取地址。
指针与数组的关系综述

由于 数 组 名 也是 数 组 第 1 元 素 的地 址 ( 地 址 ) 数 组 名加 整 数 i 是 第 i 1 元 素 的地 址 , 该 地 址 进 行 复 引 用 运算 符 运 个 首 , 就 + 个 对
算 , 可得 到 该 元 素 , 就 因此 有 :a a O和 a0等 价 , (+ 和 a ] " 。这 里 的 偏移 量 和 偏 移 字 节 数 是 有 区别 的 , 移 的 字 节数 是 基 、(+ ) [】 ai ) [ ̄/ i f 偏
# n ld sdo h i cu e” t i .”
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 +)
文献标识码 : A
文 章 编号 : O 9 3 4 (0 11 — 8 6 0 10 — 0 42 1)6 3 7 — 3
R e e t l tons p t e Po nt r nd Ar a viw he Re a i hi be we n i e sa r ys K EN Zhe g—y n — un
I SN 0 9— 0 4 S 1 0 3 4
E m i x l cc. t n — al  ̄ @ cc e. : n o
h t : w w.n sn t n t /6 0 6 5 9 9 4 e: 6 5 5 9 9 3 + 1 60 6
C语言中指针和数组区别的分析

一
、
我 们来 看 以下代码 :
i e . fl 1c
假 设 编译 器 符 号 表 给 的一 个 地 址 是 2 0 0 0程 序 运 行 时 , 3的值 , 它 与 2 0 取 将 0 0相 加 , 得 ( 0 0 3 的内 取 20 + ) 容 。 这里 , 个符 号 的地址在 编译 时可 知 。 在 每 因此 。 如果 编译 器需 要一 个地 址来 执行 某个 操作 得 花 .它就 可 以
ca ] hr I s
ad n c a s hr :
作 符 , 像减号 表示 一个 减法 运算 符一 样 。 就 取下 标操 作 符就 像 取一 个 整数 和 一个 指 向类 型 x 的指 针 . 产生 所 a e e u v l n ‘・・ r q i ae t。・ ・ 意思 是 : 为 函数 参数定 义 的形 式参 数 ,h rs 和 的结 果类 型是 X.一 个 在表达 式 中的数组 名 于是 就成 作 c a 口 了指 针 。 c a s h r 是一样 的 在 表达 式 中 . 指针 和 数组 是 可 以相互 替 换 的 , 因为 在 函数 形参 定 义这 个特 殊 的情 况 下 .编 译 器必 须 把 数 组形 式 改 写 成指 向数 组 第 一个 元 素 的指 针形 式 。 他们 在编译 器里 的最 终形 式 都是 指针 。并 且 都可 以进 在这里, 编译 器 只向 函数传 递数 组 的地 址 , 而不 是整 个 行取 下标操 作 编译 器 可 以 自动 把 下标值 的 步长 调整 到数 组 的大小 .如 : n l g型数 据 的长度 是 4个 字节 . o 那 数 组 的拷 贝 。 因此 以 下几种 :
对于 C语 言 编程新 手 来 说 . 常认 为 n 经 数组 和 指针 在 C语 言 中 。 我把 地 址形 象 地称 为 ” 针 ” 把存 放 指 . 是 相 同的 ” 。其 实这 种 说法 是不 完全 正 确 的 , 们 是有 地址 的变量 称 为指针 变 量 .通 常 我们 把指 针变 量 简称 他 区别 的。A SC标 准 6 4 N I . 2里 建议 : 5 为 指针 。 以指针 里存 放 的是 数据 的地址 。 所 而数 组里 存 注意下列 声 明 的区别 : 放 的是数 据 的值 。 e t r n x xe n i t : 2数组 和 指针 的访 问方 式不 同 . 数 组 采用 的是 直接 访 问方 式 .而指 针 采用 的是 间 etr t [ xeni ] ny; 第 一条 语 句声 明 x是一 个 it 的指 针 . 二条 语 接 访 问方 式 。 n型 第 句声 明 Y是 it . 组 长 度 尚未 确 定 . n型 数 其存 储 在 别 处 如 : h r 【】 ” hn ” c a 6= C ia; a c a3; = 【】
- 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;
}
运行:。