ch6 数组和指针(谢汶)

合集下载

数组与指针的关系解析

数组与指针的关系解析

数组与指针的关系解析数组与指针在C语言中有着密不可分的关系,理解数组与指针之间的关系对于编程人员来说至关重要。

在C语言中,数组名实际上是数组首元素的内存地址,因此数组名可以看作是一个常量指针。

首先,我们需要明确数组名和指针的区别。

数组名指向数组的首地址,而指针是一个变量,存储某个内存地址。

在C语言中,数组名是一个常量指针,即不能被赋予新的地址值,而指针则可以指向不同的内存地址。

数组与指针之间的关系可以通过以下几点来解析:1. 数组名即指针:在C语言中,数组名可以看作是一个指向数组首元素的常量指针。

数组名本身就是一个地址常量,它存储的是数组首元素的内存地址。

2. 数组名的算术运算:由于数组名是一个指针常量,因此可以对数组名进行指针算术运算。

例如,对数组名进行加法运算会导致数组名指向下一个元素的地址。

这种特性使得我们可以通过指针运算来访问数组中的元素。

3. 数组名作为函数参数:在函数参数中,数组名会退化为指针,即数组名会被解释为指向数组首元素的指针。

因此,在函数中传递数组参数时,实际上传递的是数组首元素的地址,而不是整个数组。

4. 数组和指针的区别:数组和指针虽然有联系,但是也有明显的区别。

例如,数组名是常量指针,无法赋值新的地址,而指针是变量,可以指向不同的地址。

另外,数组名和指针在内存布局上也有一些不同,数组在内存中是连续存储的,而指针可以指向非连续的内存地址。

总的来说,数组与指针在C语言中有着紧密的联系,理解数组与指针之间的关系对于编程人员来说至关重要。

通过对数组名和指针的特性及区别的分析,我们可以更好地利用它们来进行数组操作和内存管理。

希望以上内容能帮助您更好地理解数组与指针的关系。

c语言中数组与指针的关系

c语言中数组与指针的关系

c语言中数组与指针的关系“嘿,同学们,今天咱们来聊聊 C 语言中数组与指针的关系。

”在 C 语言中,数组和指针有着非常紧密的联系。

数组可以看作是一种特殊的指针。

先来说说数组,数组是一组相同类型元素的有序集合。

比如我们定义一个整型数组 int arr[5],它就包含了 5 个整型元素。

当我们使用数组名 arr 时,它实际上代表的是数组的首地址。

而指针呢,它就是用来存储地址的变量。

我们可以让一个指针指向数组的首地址,比如 int *ptr = arr;,这样 ptr 就指向了 arr 数组。

这两者的联系在很多情况下都能体现出来。

比如说,我们可以通过指针来访问数组中的元素。

就像这样,通过 ptr[0]、ptr[1]等就可以访问到数组arr 中的元素。

这就好像指针是一把钥匙,能打开数组这个宝库的每一个格子。

给大家举个例子吧,比如我们有个程序要遍历一个数组。

我们可以通过一个指针不断移动来实现。

```cint arr[5] = {10, 20, 30, 40, 50};int *ptr = arr;for(int i = 0; i < 5; i++) {printf("%d ", ptr[i]);}```在这个例子中,我们通过指针 ptr 来逐个输出数组中的元素。

而且,指针还可以进行一些灵活的操作。

比如可以进行指针的加减运算,让它指向数组中的其他位置。

但是要注意哦,在使用指针和数组的时候,一定要小心,不能越界访问,否则可能会导致程序出错甚至崩溃。

再比如说,我们在函数中传递数组的时候,实际上传递的也是数组的首地址,也就是一个指针。

这就使得函数可以直接操作数组。

总之,数组和指针在 C 语言中是紧密相关的,它们相互配合,可以让我们更高效、灵活地处理数据。

同学们一定要好好理解和掌握它们之间的关系,这样才能在 C 语言编程中更加得心应手。

c语言数组与指针实验心得

c语言数组与指针实验心得

c语言数组与指针实验心得
C语言的数组和指针一直是两个容易混淆的东西,当初在学习的时候,也许为了通过考试会对指针和数组的一些考点进行突击,但是很多极其细节的东西也许并不是那么清楚。

本篇侧重点在于分析数组与指针的关系,什么时候数组可以等同于指针,什么时候二者不同。

我们常常把指针和数组混淆,比如以下这种情况,定义为指针,却使用了数组的方式来取值。

char*p="pointertest";
c=p[i];
定义为指针,但是使用数组的方式来取值。

我们可以结合以上两种方式,来分析这种情况下的取值过程:
1.先根据符号p的地址,取到符号p的值,是一个地址,我们假设为4040,也就是和上面第二种情况的指针访问一样。

2.接下来就是4040+i,得到新的地址值
3.取新的地址的内容
同理,取偏移地址的时候,需要注意变量类型,比如int类型,就是加上i*4
以下对于二者可相互替换做一个总结
(1)externchara[];通过extern声明的数组,不能用指针形式替换
(2)数组定义为chara[5],不能用指针的形式替换
(3)数组作为函数参数,可以使用指针形式替换
(4)在表达式中,比如c=a[i],这种情况也可以使用指针形式来替换,因为在表达式中,数组名a被当做指向该数组第一个元素的指针,所以可以和指针相互替换。

而且数组下标i可以和指针的偏移量等同起来,a[i]等同于*(a+i)。

简述数组与指针的区别

简述数组与指针的区别

简述数组与指针的区别
问题:简述数组与指针的区别回答:
数组要么在静态存储区被创建(如全局数组),要么在栈上被创建。

指针可以随时指向任意类型的内存块。

(1)修改内容上的差别
char a[] = “hello”;
a[0] = ‘X’;
char *p = “world”; // 注意p 指向常量字符串
p[0] = ‘X’; // 编译器不能发现该错误,运行时错误
(2) 用运算符sizeof 可以计算出数组的容量(字节数)。

sizeof(p),p 为指针得到的是一个指针变量的字节数,而不是p 所指的内存容量。

C++/C 语言没有办法知道指针所指的内存容量,除非在申请内存时记住它。

注意当数组作为函数的参数进行传递时,该数组自动退化为同类型的指针。

char a[] = “hello world”;
char *p = a;
cout
cout
计算数组和指针的内存容量
void Func(char a[100])
{ cout }。

C语言中的数组与指针有何关系?

C语言中的数组与指针有何关系?

C语言中的数组与指针有何关系?在 C 语言的学习中,数组和指针是两个非常重要的概念,它们之间有着紧密而又微妙的关系。

理解它们之间的关系对于掌握 C 语言编程至关重要。

首先,让我们来看看数组。

数组是一组相同类型的变量的有序集合,它们在内存中是连续存储的。

比如说,我们定义一个整型数组`intarr5` ,那么在内存中就会为这 5 个整数分配连续的存储空间。

而指针呢,指针是一个变量,它存储的是另一个变量的地址。

通过指针,我们可以间接访问和操作所指向的变量。

那么数组和指针之间到底有哪些具体的关系呢?一方面,数组名在很多情况下会被当作指针来使用。

当我们使用数组名时,它会隐式地转换为指向数组第一个元素的指针。

例如,如果有一个数组`int arr5` ,那么`arr` 可以看作是一个指向`arr0` 的指针。

但需要注意的是,数组名和指针并不是完全相同的。

数组名本身代表的是整个数组的地址,而不是指向第一个元素的指针。

然而,在大多数表达式中,数组名会被自动转换为指向其第一个元素的指针,这是 C 语言为了方便编程而做的一种规定。

另一方面,我们可以通过指针来操作数组。

假设有一个指针`intptr` ,我们可以让它指向一个数组的首地址,然后通过指针的移动来访问数组中的各个元素。

例如,如果`ptr` 指向了数组`arr` 的首地址,那么`(ptr +1)`就可以访问到数组中的第二个元素`arr1` 。

通过这种方式,我们可以使用指针来遍历整个数组。

此外,在传递数组给函数时,实际上传递的是数组的首地址,也就是一个指针。

这样做可以避免复制整个数组,提高程序的效率。

比如说,我们有一个函数`void func(int arr, int size)`,在调用这个函数时,我们可以直接传递数组名,如`func(arr, 5)`,这里的`arr` 就会被当作指向数组首元素的指针传递给函数。

然而,在使用数组和指针时,也有一些容易出错的地方。

C语言中的数组与指针详解

C语言中的数组与指针详解

C语言中的数组与指针详解C语言是一门广泛应用于系统软件、嵌入式软件和应用软件开发的高级编程语言。

其中,数组和指针是C语言中常用的数据类型和概念。

在本文中,我们将详细讨论C语言中的数组和指针,包括它们的定义、使用方式以及相关的特性和技巧。

一、数组(Arrays)数组是一种用于存储多个相同类型元素的连续内存区域的数据结构。

C语言中的数组可以存储基本数据类型(如整数和字符)或自定义的数据类型(如结构体)。

数组的定义使用方括号([])来表示,并指定数组的大小。

例如,下面的代码片段展示了如何声明和初始化一个整型数组:```cint numbers[5] = {1, 2, 3, 4, 5};```在这个例子中,我们定义了一个名为numbers的整型数组,它有5个元素并初始化为{1, 2, 3, 4, 5}。

可以使用索引(index)来访问数组中的元素,索引从0开始。

数组在C语言中具有以下特点和技巧:1. 数组名即为指向数组首元素的指针。

可以使用指针运算对数组进行操作。

2. 数组的大小在编译时就确定了,并且不能动态改变。

3. 数组的元素在内存中是连续存储的,可以通过指针算术运算实现遍历和访问。

4. 数组名作为函数参数传递时会自动转换为指针。

二、指针(Pointers)指针是C语言中另一个重要的概念,它用于存储变量的内存地址。

指针变量可以指向任何数据类型,包括基本数据类型和复合数据类型。

通过指针,我们可以直接访问和修改内存中的数据。

在C语言中,可以通过使用感叹号(*)来声明指针变量。

例如,下面的代码片段展示了如何声明一个指向整型变量的指针:```cint *ptr;```在这个例子中,我们声明了一个名为ptr的指针变量,它可以指向整型变量。

我们可以使用取地址运算符(&)来获取变量的内存地址,并将其赋值给指针变量。

指针在C语言中具有以下特点和技巧:1. 可以使用指针间接访问和修改变量的值。

2. 可以通过指针传递变量的引用,从而实现函数间的数据传递。

简述 c 语言中指针与数组的联系与区别

简述 c 语言中指针与数组的联系与区别

简述 c 语言中指针与数组的联系与区别下载提示:该文档是本店铺精心编制而成的,希望大家下载后,能够帮助大家解决实际问题。

文档下载后可定制修改,请根据实际需要进行调整和使用,谢谢!本店铺为大家提供各种类型的实用资料,如教育随笔、日记赏析、句子摘抄、古诗大全、经典美文、话题作文、工作总结、词语解析、文案摘录、其他资料等等,想了解不同资料格式和写法,敬请关注!Download tips: This document is carefully compiled by this editor. I hope that after you download it, it can help you solve practical problems. The document can be customized and modified after downloading, please adjust and use it according to actual needs, thank you! In addition, this shop provides you with various types of practical materials, such as educational essays, diary appreciation, sentence excerpts, ancient poems, classic articles, topic composition, work summary, word parsing, copy excerpts, other materials and so on, want to know different data formats and writing methods, please pay attention!指针和数组是 C 语言中两个重要且常用的概念,它们在很多情况下有着密切的联系同时也存在一些明显的区别。

c课件ch06指针共74页

c课件ch06指针共74页

Page 2
1 指针变量及其操作
1.1指针的概念
指针就是地址 32位系统,1个程序有4G字节的内存空间 每个字节都对应一个地址,从0x00000000 到 0xFFFFFFFF 32位系统,地址可以用一个32位二进制数表示 定义一种变量,这种变量就存放这个地址,这种变 量就叫指针(pointer)
面向对象程序设计实践教案
Page 5
1.2指针的操作
取地址运算
把变量的地址给指针,这个操作称为取地址 (address of),一般形式是 p = &var; &称为取地址运算符。
int var = 10;
p
int *p = &var;
var(10)
面向对象程序设计实践教案
Page 6
1.2指针的操作
指针的前后移动
指针可以进行+和-的算术运算,表示指针向前、 向后移动。 p+n就表示p向前移动n*sizeof(type)个字节,反 之亦然。
面向对象程序设计实践教案
Page 9
int *p;
int var[5] = { 1, 2, 3, 4, 5 };
p = &var[0]; //p = var;
45、法律的制定是为了保证每一个人 自由发 挥自己 的才能 ,而不 是为了 束缚他 的才能 。—— 罗伯斯 庇尔

面向对象程序设计实践
第6章
指针
主讲人:杨峰
水电与数字化工程学院
主要内容
指针变量的概念
指针的概念
指针的操作
动态内存管理
传递指针参数
数组与指针
函数与指针
引用
数组、字符串与指针编程实例
面向对象程序设计实践教案

数组和指针类型详解

数组和指针类型详解

数组和指针类型详解在编程领域中,数组和指针是两个非常重要的概念。

它们在内存管理、数据结构以及算法等方面都扮演着重要的角色。

本文将详细介绍数组和指针的概念、用法和注意事项。

一、数组数组是一种数据结构,用于存储一系列相同类型的元素。

数组的特点是大小固定,元素类型相同。

我们可以通过下标来访问数组中的元素,其中下标从0开始,最大为数组大小减一。

数组的声明方式为:元素类型数组名[数组大小]。

例如,int numbers[5]表示一个包含5个整数的数组。

数组的优点在于可以快速访问和操作元素,但也有一些限制。

首先,数组的大小是固定的,一旦声明后就无法改变。

其次,数组的元素在内存中是连续存储的,因此对于大型数组的操作可能会导致内存溢出。

二、指针指针是一种变量类型,用于存储内存地址。

每个变量都有一个内存地址,指针可以指向这个地址。

通过指针,我们可以间接访问和修改变量的值。

指针的声明方式为:变量类型*指针名。

例如,int *ptr表示一个指向整数的指针。

指针的优点在于可以动态地分配和释放内存,灵活性高。

但指针也有一些注意事项。

首先,指针必须初始化后才能使用,否则可能会导致程序崩溃或不可预测的结果。

其次,指针的操作需要谨慎,避免出现悬空指针或内存泄漏的情况。

三、数组和指针的关系数组和指针在某种程度上是相互关联的。

数组名可以看作是指向数组第一个元素的指针,即数组名等价于指针。

我们可以通过指针来访问数组中的元素,也可以通过数组名来访问数组中的元素。

例如,对于数组int numbers[5],我们可以通过指针int *ptr = numbers或直接通过numbers[0]来访问第一个元素。

指针和数组名的区别在于,指针可以进行递增和递减操作,而数组名不可以。

四、指针和数组的应用指针和数组在编程中有许多实际应用。

以下是一些常见的应用场景:1. 动态内存分配:通过指针可以动态地分配和释放内存,灵活性高。

例如,使用指针可以创建可变大小的数组,减少内存的浪费。

C语言关于数组与指针的总结

C语言关于数组与指针的总结

数组与指针有很密切的联系,常见的结合情况有以下三种:•数组指针•指针数组•二维数组指针2数组指针数组指针:指向数组的指针。

如:int arr[] = {0,1,2,3,4};int *p = arr;//也可写作int *p=&arr[0]也就是说,p,arr,&arr[0]都是指向数组的开头,即第0个元素的地址。

如果一个指针p指向一个数组arr[]的开头,那么p+i为数组第i 个元素的地址,即&arr[i],那么*(p+i)为数组第i个元素的值,即arr[i]。

同理,若指针p指向数组的第n个元素,那么p+i为第n+1个元素的地址;不管 p 指向了数组的第几个元素,p+1 总是指向下一个元素,p-1 也总是指向上一个元素。

下面示例证实了这一点:#include <stdio.h>int main(void){int arr[] = {0, 1, 2, 3, 4};int *p = &arr[3]; //也可以写作 int *p = arr + 3;printf("%d, %d, %d, %d, %d\n",*(p-3), *(p-2), *(p-1), *(p), *(p+1) );return 0;}运行结果为:0, 1, 2, 3, 43指针数组指针数组:数组中每个元素都是指针。

如:int a=1,b=2,c=3;int *arr[3] = {&a,&b,&c};示例程序:#include <stdio.h>int main(void){int a = 1, b = 2, c = 3;//定义一个指针数组int *arr[3] = {&a, &b, &c};//也可以不指定长度,直接写作 int*parr[]//定义一个指向指针数组的指针int **parr = arr;printf("%d, %d, %d\n", *arr[0], *arr[1], *arr[2]);printf("%d, %d, %d\n", **(parr+0), **(parr+1), **(parr+2));return 0;}第一个printf() 语句中,arr[i] 表示获取第i 个元素的值,该元素是一个指针,还需要在前面增加一个 * 才能取得它指向的数据,也即 *arr[i] 的形式。

c++ 数组和指针 详解

c++ 数组和指针 详解

c++ 数组和指针详解C++中的数组和指针是非常重要的概念,它们在编程中起着至关重要的作用。

让我们从数组开始。

数组是一种数据结构,用于存储相同类型的元素。

在C++中,数组可以是一维的,也可以是多维的。

例如,int numbers[5]声明了一个包含5个整数的数组。

数组的元素可以通过索引访问,索引从0开始,因此numbers[0]表示数组的第一个元素,numbers[1]表示第二个元素,依此类推。

指针是一个变量,其值为另一个变量的地址。

通过指针,我们可以间接访问变量的值。

在C++中,可以使用指针来操作数组。

首先,让我们看看如何使用指针来访问数组的元素。

例如,如果我们有一个指向整数的指针ptr,我们可以使用ptr来访问数组的元素。

假设我们有一个数组int numbers[5],我们可以将指针ptr指向数组的第一个元素,即ptr = &numbers[0]。

然后,我们可以使用指针来访问数组的元素,例如(ptr+1)将给出数组的第二个元素的值。

另外,指针和数组之间存在着密切的关系。

在C++中,数组名实际上就是一个指向数组第一个元素的指针。

例如,如果我们有一个数组int numbers[5],则numbers本身就是一个指向数组第一个元素的指针。

因此,我们可以使用数组名来操作数组的元素,就像使用指针一样。

此外,指针和数组还可以通过指针算术和指针递增来进行操作。

指针算术允许我们对指针进行加法和减法操作,以便访问数组中的不同元素。

例如,ptr+1将指向数组的下一个元素。

指针递增是指将指针向前移动一个元素的大小,这在遍历数组时非常有用。

总之,C++中的数组和指针是非常重要的概念,它们可以一起使用来有效地操作和访问数据。

通过深入理解数组和指针的关系,我们可以写出更加高效和灵活的代码。

希望这个解释能够帮助你更好地理解C++中的数组和指针。

C语言中的指针与数组

C语言中的指针与数组

C语言中的指针与数组1. 指针与数组的概念及作用在C语言中,指针和数组是两个重要的概念,它们在编程中起着关键的作用。

指针是一个变量,用于存储内存地址,而数组是一组相同类型的数据元素的集合。

指针与数组的相互关系是C语言中的重要基础。

2. 指针与数组的声明与初始化指针和数组的声明与初始化方式有所不同。

指针的声明需要指定指针所指向的数据类型,并使用"*"符号来指定变量为指针类型。

而数组的声明则需要指定数组的名称和元素的类型,并使用方括号来指定数组的长度。

在初始化方面,指针可以通过赋值操作指向已定义的变量或使用动态内存分配函数进行初始化,而数组可以在声明时进行初始化或使用赋值操作对数组进行初始化。

3. 指针与数组的访问与操作指针和数组可以通过索引的方式进行访问和操作。

对于数组,可以使用索引运算符"[]"来访问数组中的元素,索引从0开始,依次递增。

而指针可以通过指针运算符"->"或"*"来访问指向的内存地址中存储的数据。

此外,指针还可以通过指针运算进行地址的偏移。

4. 指针与数组的关系与转化指针和数组在C语言中有着密切的关系,可以相互转化。

数组名本身就是一个指针常量,它存储了数组第一个元素的地址。

因此,可以使用指针的方式来操作数组,如通过指针进行元素的访问和修改。

同样,也可以将指针转化为数组,通过指针进行的操作可以通过数组名来实现。

5. 指针与多维数组在C语言中,指针也可以用于处理多维数组。

多维数组可以看作是数组的数组,可以通过指针和循环嵌套的方式进行遍历和操作。

对于二维数组,可以使用指针数组或指向数组的指针来进行处理,通过指针的方式可以提高代码的效率和简洁性。

6. 指针与动态内存管理指针在动态内存管理中发挥了重要作用。

通过指针的方式可以使用动态内存分配函数如malloc()和free()来进行内存的动态分配和释放,以满足程序运行时的需求。

C语言指针与数组的关系

C语言指针与数组的关系

C语言指针与数组的关系在C语言中,指针和数组是两个重要的概念。

指针是一个变量,它存储了一个地址值,可以用来访问该地址处的数据。

而数组是一组相同类型的数据的集合,每个数据可以通过索引访问。

指针与数组之间有着密切的关系。

实际上,数组名就是一个指向数组第一个元素的指针。

我们可以通过指针来访问数组中的元素,也可以通过数组名来访问数组中的元素。

首先,我们来看一下通过指针来访问数组元素的方法。

假设我们有一个整型数组arr,我们可以定义一个指向该数组的指针ptr,然后使用指针来访问数组元素。

示例如下:```cint arr[5] = {1, 2, 3, 4, 5};int *ptr = arr; // 数组名即为指针printf("%d\n", *ptr); // 输出数组第一个元素的值printf("%d\n", *(ptr + 1)); // 输出数组第二个元素的值printf("%d\n", *(ptr + 2)); // 输出数组第三个元素的值```以上代码中,我们通过指针ptr访问了数组arr中的元素。

使用指针访问数组元素的方式与使用数组名的方式完全等价。

因此,我们也可以通过数组名来访问数组元素,示例如下:```cint arr[5] = {1, 2, 3, 4, 5};printf("%d\n", arr[0]); // 输出数组第一个元素的值printf("%d\n", arr[1]); // 输出数组第二个元素的值printf("%d\n", arr[2]); // 输出数组第三个元素的值```上述代码中,通过数组名arr直接访问了数组元素。

在这个过程中,编译器会将数组名转化为指向数组第一个元素的指针。

除了通过指针或数组名访问数组元素外,我们还可以将指针用于数组的遍历。

可以使用指针加法和指针递增来实现数组的遍历。

小猪猪C++笔记基础篇(四)数组、指针、vector、迭代器

小猪猪C++笔记基础篇(四)数组、指针、vector、迭代器

⼩猪猪C++笔记基础篇(四)数组、指针、vector、迭代器⼩猪猪C++笔记基础篇(四)关键词:数组,Vector。

数组与指针⼀、⼀、数组与指针数组相信⼤家学过C语⾔或者其他的语⾔都不陌⽣,简单的就是同⼀个变量类型的⼀组数据。

例如:int a[10],意思就是从a开始有10个连续的int⼤⼩的空间。

我们还是从初始化说起。

我们以数据类型int为例,当然也可由有很多的数据类型,可以是像int,double这种,也可以是⾃定义的类,⼀般的初始化⽅法有:int a[10];int a[10]={0};int a[3]={0,1,2};在前⾯的⽂章中,有的朋友提到了指针的运算,指针的运算在数组中是⾮常常见的。

我们可以把a[10]看做10个连续的存储空间。

那么a其实就是⼀个int型的指针,存放数组开始的位置,指向a[0]这个元素。

那么容易知道a+1就是指向a[1],a+5就是指向a[5]了。

于是根据指针的概念我们可以知道:*a和a[0]是等价的,*(a+5)和a[5]等价的,注意*(a+5)的括号位置,如果你写成*a+5那么结果等价于a[0]+5。

写⼀⼩段代码测试⼀下:int a[6]={1,3,5,7,9,10};cout<<"a[0]: "<<a[0]<<"*a "<<*a<<endl;cout<<"a[5]: "<<a[5]<<" *(a+5)"<<*(a+5)<<"*a+5 "<<*a+5<<endl;结果就是这样的!那么前⾯⽂章中有朋友也提到了,a+1其实加的是步长,并且说a+1等价于a+sizeof(int)那么到底是不是这么回事呢。

跟上上⾯这个初始化过的a,我们再做⼀个实验:cout<<sizeof(int)<<endl;cout<<a<<endl;cout<<a+1<<endl;cout<<a+sizeof(int)<<endl;int b[3]={0};int c[3]={0};cout<<b<<" "<<c<<" "<<b-c<<endl;从结果可以看到,sizeof(int)=4,⼀个B有8个bit,就是说我们这⾥的int 是32位。

ch6 数组、函数和指针

ch6 数组、函数和指针


28
字符型数组的初始化
① 以列表形式初试化
例:
char c[6]={‘H’,’e’,‘l’,‘l’,‘o’,‘!’} //6个字符将分别赋给c[0]-c[5]
② 用字符串常量初试化字符数组。
例:
char c[]={‚Hello!‛} 或者: char c[]=‚Hello!‛
找出数组中的最大数 题目分析:
① 定义一个数组a,以及存放最大数的变量max; ② 定义计数变量i(也是数组长度值),并设i=0;
③ 令max=a[i](即:假设数组中第1个元素最大) ;
④ 将a[i](0<= i < n)与max进行比较:
若a[i] < max ,i=i+1,再执行3
存贮结构:
二维数组在内存中按一维数组存放、占据一片连续的存贮单元; 是‚按行顺序‛在内存中分配存贮单元。 假设M数组存放在从 1000 开始的内存区域中, 1 个元素占 4 字节, 则 前 16 字 节 存 放 第 0 行 的 元 素 , 第 二 个 16 字 节 存 放 第 1 行 元 素,……
一维数组 多维数组
5
1. 一维数组
特点:
每个元素只有一个下标
程序中使用数组时,必须先定义
例如: int array[10];
6
1) 一维数组定义
一维数组的定义格式:
类型名 数组名 [常量表达式] 例如: int a[10];
a[0] a[1]
1 2
说明:
方括弧括中的下标表示元素在数组中的位臵。
27
2. 字符型数组
C语言中没有字符串类型变量,字符串需要存 放在字符型数组中。

深入理解数组指针与指针数组的区别

深入理解数组指针与指针数组的区别

深⼊理解数组指针与指针数组的区别
数组指针p是⼀个指针,⽽指针数组p是⼀个存放N个指针变量的数组。

优先级⾼([]、()的优先级是⼀样的,但它们的⽅向是从左⾄右的,所以先运⾏括号⾥的*p),⾸先说明p是⼀个指针,指向⼀个整型的⼀维数组,这个⼀维数组的长度是n,也可以说是p的步长。

也就是说执⾏p+1时,p要跨过n个整型数据的长度
(n*sizeof(int))。

如要将⼆维数组赋给⼀指针,应这样赋值:
int a[3][4];
int (*p)[4]; //该语句是定义⼀个数组指针,指向含4个元素的⼀维数组。

p = a; //将该⼆维数组的⾸地址赋给p,也就是a[0]或&a[0][0]
p++; //a[1]p[1]
同时⽤来指向⼆维数组时,其引⽤和⽤数组名引⽤都是⼀样的即。

⽐如要表⽰数组中i⾏j列⼀个元素a[i][j]:
优先级⾼,先与p结合成为⼀个数组,再由int*说明这是⼀个整型指针数组,它有n个指针类型的数组元素:这样赋值也是错误的:p=a;因为p是个右值,p的值只存在p[0]、p[1]、p[2]...p[n-1],⽽且它们分别是指针变量可以⽤来存放变量地址。

但可以这样*p=a; 这⾥*p表⽰指针数组第⼀个元素的值,a的⾸地址的值。

如要将⼆维数组赋给⼀指针数组:
int *p[3];
int a[3][4];
for(i = 0; i < 3; i++)
p[i] = a[i];
这⾥int *p[3] 表⽰⼀个⼀维数组内存放着三个指针变量,分别是p[0]、p[1]、p[2],默认情况下这三个指针变量都指向NULL 的,所以要分别赋值。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
• 第二个函数,Free(p),用于释放用 Malloc( )函数分配的存储字符串的空 间,从而让操作系统回收该存储空间, 以便以后使用。
2013-7-8
主讲教师:四川大学计算机学院 谢汶
26

第六章
图6.7 分配内存
2013-7-8
主讲教师:四川大学计算机学院 谢汶
27

2013-7-8
主讲教师:四川大学计算机学院 谢汶
17

第六章
6.3 指针和数组
•pi=&a[0]
2013-7-8
主讲教师:四川大学计算机学院 谢汶
18

第六章
• 符号a[i]指数组的第i+1个元素。如果 pa是一个指向一个整数的指针,作以 下指针变量定义以后:
• *pi=0;
/*等价于x=0*/
• pi=&z[5]; /*指针pi指向数组元素z[5]的地址*/
• Double *dp, atof(char* str); /* 说明dp是一个 指向double型变量的指针,atof返回bouble 型 数据,实参str是指向char型的指针。*/
2013-7-8
主讲教师:四川大学计算机学院 谢汶
3

第六章
• 指针是C语言中最强大也最危险的一个 特性。一个无效指针就可能导致整个 程序崩溃。更糟糕的是错误使用指针 可能导致极难查找的bug。
• 作为一名C语言的学习者,必须非常清 楚地弄明白C语言的指针,否则您就不 要对外宣称您学习过C语言。”
• 例题6.1利用值传递将实参值传递给形 参
2013-7-8
主讲教师:四川大学计算机学院 谢汶
12

第六章
void Swap1(int x, int y)
{
int temp;
temp = x;
x = y;
y = temp; }
2013-7-8
主讲教师:四川大学计算机学院 谢汶
13
2013-7-8
主讲教师:四川大学计算机学院 谢汶
15

第六章 例题6.2 获取一个浮点型数据并能够返回状态
• 在前面我们已经多次用到scanf函数。如 果用scanf读取1个数给a,必须用&a,即 取a的地址。下面设计GetDouble函数获 得一个双精度数。
• 例6.2用DetDouble函数为double数组 array读取数值。
• int *pa; /* 定义了一个指针变量 */ /* 等价于pa = a */ • 则赋值语句: • pa = &a[0];
• 将让pa指向数组a的第1个元素a[0]。
2013-7-8
主讲教师:四川大学计算机学院 谢汶
19

第六章图6.5 数组的存储空间分配及指针指向数组元素
30

第六章
6.5 字符指针和函数
2013-7-8
/*等价于x=x+10; */
8
主讲教师:四川大学计算机学院 谢汶

第六章
6.1 指针和地址
• int x=10, y=20, z[8]; /定义普通变量和数组*/
• int *pi; • pi=&x; • y=*pi; /*定义指向int型变量的指针变量*/ /*将x的地址赋值给pi*/ /*等价于y=x*/
• *pi++ ;
/* 取pi的地址加1后所指的对象内容*/
2013-7-8
主讲教师:四川大学计算机学院 谢汶
10

第六章
6.1 指针和地址
如果qi是指向int的 另一个指针,则语 句: pi = &i; qi = pi 将pi的内容复制到 qi( pi和qi指针变 量的内容就是它们 所指向的变量的地 址值)。
第六章
主讲教师:谢汶 邮件地址:xiewen@
2013-7-8
主讲教师:四川大学计算机学院 谢汶
1

第六章
本章主要内容
1 指针和地址、函数参数、数组 2 3 地址运算 字符指针和函数 4 5 6 指针数组和指向指针的指针
0x1C 0x18
FIQ IRQ
6.1 指针和地址
• 而指针变量p的定义格式如下:
• int *pi; /*在变量前面加上*,表示 指针*/ • 一元运算符*是间接寻址运算符,当用于指 针是,表示该指针所指对象的内容(值)。 注意与上面的指针变量定义的*区别。 • 如果pi指向一个整型数据x,那么*pi能够出 现在任何x能够出现的地方。比如: • *pi = *pi + 10;
第六章
*例题6.4 Malloc( )和Free( )
char *Malloc(int n) { if (mBuf + MSIZE - pTop >= n) { pTop += n; return pTop - n; } else { return 0; } }
主讲教师:四川大学计算机学院 谢汶
28
2013-7-8
主讲教师:四川大学计算机学院 谢汶
11

第六章
6.2 指针和函数参数
• 函数:swap1( )和swap2( ),前者通过 一般变量传值,后者通过指针传值。
• swap1(a1, b1); swap2(&a2, &b2); • 通过一般变量传值时,传递的是变量 的值,而采用指针变量传值时传递的 是变量的地址。 后者可以通过间接寻 址而改变对象的值。
2013-7-8
主讲教师:四川大学计算机学院 谢汶
5

第六章
6.1 指针和地址
图6.1字符指针指向字符变量
2013-7-8
主讲教师:四川大学计算机学院 谢汶
6

第六章
6.1 指针和地址
• 通过一元运算符&( 取地址运算符,注 意与二元运算符&区分),可以取出 “对象”( 这里的对象指各种类型的变 量)的地址,因此语句:
• 而p+i则将指针p增加i指向当前元素后 的第i个元素。这些结构是指针和地址 运算的最简单形式。
2013-7-8
主讲教师:四川大学计算机学院 谢汶
25

第六章
• 下面我们写一个初步的存储器分配程 序来说明地址运算的问题。共有两个 函数: • 第一个函数,Malloc(n),返回一个指 向n个连续字符的指针,该指针可以被 Malloc ( )的调用者用来分配存储字符 的空间;
0x14
0x10 0x0C 0x08 0x04 0x00
(Reserved) Data Abort
Prefetch Abort
Software Interrupt Undefined Instruction
多维数组
字符、整型数组和外部变量
谢汶

Reset
2013-7-8
ARM Vector Table 主讲教师:四川大学计算机学院
• 在函数中,虚参 *pd实际上代表了传递 过来的实参,可以象普通的double变量 一样使用。
2013-7-8
主讲教师:四川大学计算机学院 谢汶
16

第六章
6.3 指针和数组
• 任何能够通过数组下标完成的操作也 能够通过指针来完成。用指针操作比 • int a[10]; /* 定义数组a */ • 就定义了一个有10个整型元素的数组a。 数组a存放在一段连续的内存区域中, 它由10个元素组成,这些元素的名字 分别为:a[0]、a[1]、.......、a[9]。
2
第六章
本章的节本要求
• 指针变量是用来存放地址的一种特殊 变量。
• 指针常常用于数组操作,因为指针运 算常常比数组下标运算更快。 • 指针至关重要,原因如下:指针提供 了函数修改实参的方法;指针支持动 态内存分配;指针可以提高某些程序 的效率;指针支持动态数据结构,比 如二叉树、链表等。
2013-7-8

第六章
void Swap2(int *pi, int *pj)
{
int temp;
temp = *pi;
*pi = *pj;
*pj = temp; }
2013-7-8
主讲教师:四川大学计算机学院 谢汶
14

第六章
在以下语句中: Swap2(&a2, &b2); 运算符&就是取变 量地址的意思。
2013-7-8

第六章
*例题6.4 Malloc( )和Free( )
void Free(char *p)
{
if (p >= mBuf && p < mBuf + MSIZE)
{
pTop = p;
} }
2013-7-8
主讲教师:四川大学计算机学院 谢汶
29

2013-7-8
主讲教师:四川大学计算机学院 谢汶
23

第六章
图6.6 StrCat( )的操作过程
2013-7-8
主讲教师:四川大学计算机学院 谢汶
24

第六章
6.4 地址运算
• 如果p是一个指向某个数组元素的指针, 则p++ 将p增加1以指向数组的下一个 元素。
主讲教师:四川大学计算机学院 谢汶
9

第六章
6.1 指针和地址
• 注意:某种类型的指针只能指向该类型的 变量。 void型指针例外,它可以指向任何 类型的变量。 • pi是指针,而*pi不是指针!
相关文档
最新文档