数组及指针 知识点总结

合集下载

专题7 数组和指针的应用

专题7  数组和指针的应用

例1. 写出结果: main() { int *p1, a[10]={1,2,3,4,5,6,7,8,9,10} ; p1=a; printf(“%d ”,*p1); printf(“%d ”,*p1++); printf(“%d ”, *(p1+3)); printf(“%d ”,*++p1); printf(“%d ”,(*p1)++); printf(“%d ”,*p1--); printf(“%d ”,*p1); } 例2.若有定义语句:double x[5]={1.0,2.0,3.0,4.0,5.0},*p=x;则错误引用x数 组元素的是[08年9月] A)*p B)x[5] C)*(p+1) D)*x
[C] D) aa+1
(3)通过指针变量来表示数组中各元素的地址
可以定义一个指针变量来存放数组的指针或数组元素的指针,且指针变 量的基类型就是定义数组时的类型 int *p,a[10]; for(p=a,k=0; k<10;k++) p++; 将数据写入数组元素中几种方式: (1)for(p=a,k=0; k<10;k++) { scanf(“%d”,p); p++; } 进一步简化: (2)for(p=a,k=0; k<10;k++) scanf(“%d”,p++); 再进一步简化: (3)for(p=a,p-a<10; p++) scanf(“%d”,p); 以上三种写法是等价的,要掌握,能看懂。
2、 通过指针变量来引用一维数组元素 当指针变量指向数组中的某个数组元素时,可以通过“*”来访问其所 指向变量的数据。

指针和数组的关系

指针和数组的关系

指针和数组的关系
指针和数组是C语言中非常重要的概念,理解它们对于编写高效程序和避免常见错误
至关重要。

指针和数组的关系可以说是紧密相连的,因为数组名本质上就是一个指针。

在C语言中,数组名表示一个指向该数组第一个元素的指针,也就是数组的起始地址。

因此,如果我们定义一个数组a,那么&a和a是等价的,都表示数组第一个元素的地址。

例如,定义一个整型数组a:
int a[5] = {1, 2, 3, 4, 5};
我们可以通过数组名a访问数组中的元素。

例如,a[0]表示数组中的第一个元素,即1。

在C语言中,数组名本身是一个常量,即不能对其进行修改。

但是,我们可以使用指
针来访问数组中的元素,这就需要对指针进行加减运算来实现。

我们可以定义一个指向数组a的指针p,然后通过指针访问数组中的元素。

例如,*p
表示指针p所指向的数组的第一个元素,即1。

我们可以通过p++将指针p指向数组中的下一个元素,例如*p++表示指向数组中的第二个元素,即2。

因此,数组名和指针在C语言中是紧密相关的,数组名本质上就是一个指向数组第一
个元素的指针。

我们可以通过指针访问数组中的元素,并通过加减运算实现对数组的遍
历。

在实际编程中,使用指针可以提高程序的效率和灵活性。

使用指针可以避免对数组名
的重复引用,从而减少程序的存储空间和运行时间开销。

但是,指针操作也比较容易出现指针越界、空指针等错误,因此在使用指针时需特别
注意,避免出现不必要的错误。

大一c语言期末必备知识点

大一c语言期末必备知识点

大一c语言期末必备知识点C语言作为计算机科学和编程领域中最为基础和重要的编程语言之一,在大一的学习中扮演着重要的角色。

掌握C语言的核心知识点对于顺利通过期末考试至关重要。

本文将为大一同学总结C语言期末考试中的必备知识点,帮助大家提高复习效率和考试成绩。

知识点一:基本语法1. 注释:单行注释以"//"开头,多行注释以"/*"开头,以"*/"结尾。

2. 标识符:变量名、函数名、标签等的命名规则和规范。

3. 数据类型:包括整型、浮点型、字符型和指针型等。

4. 变量和常量:定义变量和常量的方式以及使用的规范。

5. 运算符:包括算术运算符、赋值运算符、逻辑运算符等。

6. 控制语句:包括条件语句(if-else语句)和循环语句(while循环、do-while循环和for循环)等。

7. 函数:函数的定义、函数的调用以及函数的返回值。

1. 数组:一维数组和多维数组的定义、初始化和使用等。

2. 指针:指针的概念、指针的运算、指针和数组的关系等。

3. 字符串:字符串的定义、字符串的操作和字符串的输入输出等。

知识点三:文件操作1. 文件指针:文件指针的定义、文件指针的定位等。

2. 文件读写:打开文件、关闭文件、读取文件内容、写入文件内容等。

知识点四:内存管理1. 动态内存分配:使用malloc、calloc和realloc等函数进行动态内存分配。

2. 内存释放:使用free函数释放动态分配的内存。

1. 结构体:结构体的定义、结构体数组和结构体指针等。

2. 链表:单链表和双链表的定义、插入节点、删除节点和遍历链表等。

知识点六:预处理指令1. 宏定义:使用#define进行宏定义。

2. 条件编译:使用#ifdef、#ifndef、#endif和#elif等来控制代码的编译。

知识点七:函数库1. 标准输入输出库:使用stdio.h中的函数进行输入输出操作。

2. 数学库函数:使用math.h中的函数进行数学计算。

数组和指针的区别

数组和指针的区别

数组和指针的区别数组和指针是C语言中非常重要的两个概念,它们在编写程序时起着极其重要的作用。

虽然它们在某种程度上非常相似,但它们之间也存在着很多的差异,下面我们就来分析一下它们的区别。

1. 定义方式数组是由一组具有相同类型的数据元素所组成的有序集合,每个元素具有相同的数据类型,可以通过下标在数组中访问对应的元素。

在C中,定义一个数组可以使用以下语句:```int arr[10];```这个语句定义了一个名为arr的整型数组,这个数组有10个元素。

而指针是一个变量,它存放了一个内存地址,这个地址与它存储的数据类型有关。

在C中,定义一个指针可以使用以下语句:```int *p;```这个语句定义了一个名为p的指针,这个指针指向一个整型变量。

2. 内存分配数组在定义时要求需要一定的内存空间来存储数组元素,因此在定义时就已经确定了内存空间的大小,且数组的大小不可改变。

例如,如果定义一个大小为10的数组,则它的大小就是10,无论实际使用时需要存储的元素个数是多少,数组的大小都不会改变。

而指针在定义时只需要分配一个指针变量所需的内存空间,该指针可以在程序运行时动态地分配内存,因此指针所指向的内存空间大小不确定,需要在运行时根据需要动态地分配或释放空间。

3. 访问方式在数组中,可以通过数组的下标来访问数组中具体的元素,下标从0开始,最大下标为数组大小减1。

例如,访问arr数组中的第三个元素可以写成:arr[2]。

而对于指针,可以通过指针变量所指向的地址来访问该地址所对应的值。

例如,访问p指针所指向地址上的整型变量可以写成:*p。

4. 传递方式在函数调用时,数组可以通过值传递或指针传递来传递数组的值。

如果数组作为参数传递给函数时,实际上传递的是该数组的地址,即使数组非常大,也不会导致栈溢出。

而对于指针,只能通过指针传递方式来传递指针变量的值,在函数内部可以通过指针来修改该指针所指向的地址所存储的值,因此指针可以用来传递地址或修改变量的值。

用指针访问数组的方法

用指针访问数组的方法

用指针访问数组的方法一、指针与数组的关系。

1.1 指针就像是数组的导航员。

数组在内存里是一块连续的空间,就像住在公寓里的一排房间。

而指针呢,就好比是房间的钥匙或者说是指向这些房间的路标。

它能准确地找到数组里的每个元素,这就跟你拿着钥匙能打开对应的房间门一样。

咱们可以把数组想象成一群小伙伴排着队,指针就可以指出哪个是排头,哪个是排尾,还能找到中间的小伙伴。

1.2 从本质上来说,数组名其实就是一个指针常量。

这就像是一个固定的地址标签,它指向数组的第一个元素。

就好比你家的门牌号,永远指着你家这个“元素”所在的位置。

而且,这个指针常量是不能被修改的,就像你不能随便更改你家的门牌号一样。

二、用指针访问数组元素。

2.1 简单的访问方式。

咱们先定义一个数组,比如说int arr[5] = {1, 2, 3, 4, 5};再定义一个指针,int p = arr; 这里的arr就相当于把数组的首地址给了指针p。

现在如果我们想访问数组的第一个元素,就可以用p,这就像是通过钥匙打开了第一个房间。

如果我们想访问第二个元素呢,那就可以让指针p指向下一个元素,也就是p++,然后再用p来获取这个元素的值。

这就好像你沿着走廊走到下一个房间,再用钥匙打开门看看里面有啥。

2.2 灵活的遍历。

通过指针来遍历数组那是相当方便的。

我们可以写一个简单的循环,像这样:for (int p = arr; p < arr + 5; p++) { printf("%d ", p); }。

这个循环就像是一个小机器人,从数组的开头沿着指针这个“导航路线”一直走到结尾,把每个房间里的东西(元素的值)都展示出来。

这就好比是你沿着一排房间一个一个地查看里面的情况,一个都不落下。

2.3 指针运算的妙处。

指针的运算在访问数组的时候可是很有讲究的。

比如说,p + 2,这里可不是简单的数学加法,它实际上是让指针向后移动两个元素的位置。

这就像是你一下子跳过两个房间,直接到第三个房间的门口。

理解C语言(一)数组、函数与指针

理解C语言(一)数组、函数与指针

理解C语⾔(⼀)数组、函数与指针1 指针⼀般地,计算机内存的每个位置都由⼀个地址标识,在C语⾔中我们⽤指针表⽰内存地址。

指针变量的值实际上就是内存地址,⽽指针变量所指向的内容则是该内存地址存储的内容,这是通过解引⽤指针获得。

声明⼀个指针变量并不会⾃动分配任何内存。

在对指针进⾏间接访问前,指针必须初始化: 要么指向它现有的内存,要么给它分配动态内存。

对未初始化的指针变量执⾏解引⽤操作是⾮法的,⽽且这种错误常常难以检测,其结果往往是⼀个不相关的值被修改,并且这种错误很难调试,因⽽我们需要明确强调: 未初始化的指针是⽆效的,直到该指针赋值后,才可使⽤它。

 int *a;*a=12; //只是声明了变量a,但从未对它初始化,因⽽我们没办法预测值12将存储在什么地⽅int *d=0; //这是可以的,0可以视作为零值int b=12;int *c=&b;另外C标准定义了NULL指针,它作为⼀个特殊的指针常量,表⽰不指向任何位置,因⽽对⼀个NULL指针进⾏解引⽤操作同样也是⾮法的。

因⽽在对指针进⾏解引⽤操作的所有情形前,如常规赋值、指针作为函数的参数,⾸先必须检查指针的合法性- ⾮NULL指针。

解引⽤NULL指针操作的后果因编译器⽽异,两个常见的后果分别是返回置0的值及终⽌程序。

总结下来,不论你的机器对解引⽤NULL指针这种⾏为作何反应,对所有的指针变量进⾏显式的初始化是种好做法。

如果知道指针被初始化为什么地址,就该把它初始化为该地址,否则初始化为NULL在所有指针解引⽤操作前都要对其进⾏合法性检查,判断是否为NULL指针,这是⼀种良好安全的编程风格1.1 指针运算基础在指针值上可以进⾏有限的算术运算和关系运算。

合法的运算具体包括以下⼏种: 指针与整数的加减(包括指针的⾃增和⾃减)、同类型指针间的⽐较、同类型的指针相减。

例如⼀个指针加上或减去⼀个整型值,⽐较两指针是否相等或不相等,但是这两种运算只有作⽤于同⼀个数组中才可以预测。

c语言指针教学中的知识点分析与总结

c语言指针教学中的知识点分析与总结

c语言指针教学中的知识点分析与总结c语言指针教学中的知识点分析与总结本文对c语言指针的教学进行了探讨和总结。

要想真正的掌握c 语言的指针,首先必须要对它有全面深刻的认识。

因为它是c语言的基础,只有将指针的知识学好,才能够更好地学习后续的课程。

下面小编给大家介绍一下关于c语言指针的知识。

一、 c语言中指针的定义指针是一种特殊的数据类型,也称为引用类型。

所谓指针就是指向一个地址的变量,例如: int a[10];二、变量指针及指针变量1.1 c语言中的变量。

变量是存储在计算机中的二进制数值,当我们需要使用时,必须创建一个变量并赋予它相应的值,然后将变量的地址传递给外部的一个或多个对象,这样外部对象通过访问内部变量来使用其中存储的信息,而且可以保证外部对象不会越界。

1.2指针变量是变量的一种特殊形式,指针变量在内存中占有一块区域,可以指向一个地址,这个地址的值是这个变量所代表的值,这样方便变量间的传递。

例如: char *a[10];2.1指针操作符2.2指针数组,它的作用和一维数组相同,即具有一维数组的特点,也具有二维数组的特点,三者最明显的区别就是二维数组中元素个数是固定的,而一维数组中元素个数是可变的。

2.3指针的运算规则。

在指针变量的操作中,要遵循以下运算规则:原地址→指针地址。

例如: char * a[10]; 2.4 c语言中的const指针常量是一种特殊的指针常量, const不是一种变量的标准类型,它专门用于指向一个const指针。

2.3指针的运算规则。

在指针变量的操作中,要遵循以下运算规则:原地址→指针地址。

例如: char *a[10];2.4指针的定义与使用:所谓指针就是指向一个地址的变量,例如: int a[10]; 2.4指针的定义与使用: pointer, pointer-pointer,and-and-and。

所以,当我们在一个字符串中出现pointer,pointer-pointer, and-and-and的时候,就表示它指向一个地址。

C语言数组名及指向数组指针的小结

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. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

第9章数组第1课知识点一定义一维数组格式: 类型名数组名[元素个数]例1 定义一个包含4个整数的数组aint a[4];例2 定义一个包含3个双精度数的数组bdouble b[3];注意: C语言中数组的下界从0开始计数。

例如: a[4]的4个元素分别为a[0]、a[1]、a[2]、a[3]知识点二一维数组的初始化用一对大括号将数组的初值括起来。

例1 int a[3]={1, 2, 3};此例中a[0]值为1、a[1]值为2、a[2]值为3例2 int a[5]={0};此例中数组a的全部元素值均为0例3 int a[3]={1, 2, 3, 4};此例中由于初值个数多于数组元素个数,所以非法。

例4 int a[ ]={0, 0, 0, 0};此例中省略数组元素个数,初值为4个0等价于int a[4]={0};注意: 数组名是一个常量值,不能对它赋值。

例如: int a[3];a=5; 此语句非法,应改为a[0]=5;知识点三一维数组应用例1 从键盘上输入10个整数,输出最大数和最小数。

#include<stdio.h>main(){int a[10],i,max,min;printf("请输入10个整数:\n");for(i=0;i<=9;i++)scanf("%d",&a[i]);max=a[0];min=a[0];for(i=1;i<=9;i++){if(a[i]>max) max=a[i];if(a[i]<min) min=a[i];}printf("最大数是%d\n",max);printf("最小数是%d\n",min);}例2 斐波数列的定义如下:1、1、2、3、5、8、13、……编程输出斐波数列的第40项值。

#include<stdio.h>main(){long a[40];int i;a[0]=1;a[1]=1;for(i=2;i<=39;i++)a[i]=a[i-1]+a[i-2];printf("%ld",a[39]);}练习题1 从键盘上输入10个整数,输出其中完全平方数之和。

2 从键盘上输入10个整数,输出和平均数最接近的数。

第2课知识点一定义二维数组格式: 类型名数组名[一维上界][二维上界]例1 定义一个2行2列的整型数组aint a[2][2];此例中数组a共有4个元素,分别是a[0][0]、a[0][1]、a[1][0]、a[1][1]。

例2 定义一个4行4列的整型矩阵aint a[4][4];二维数组看成一维数组例如: a[3][4]看成由a[0]、a[1]、a[2]组成的一维数组,每个元素又是由4个元素组成的一维数组。

注意: a[0]、a[1]、a[2]不是元素,而是数组每行首地址。

知识点二二维数组的初始化用嵌套的大括号将数组初值括起来。

例1 int a[4][3]={ {1,2,3}, {4,5,6}, {7,8,9}, {10,11,12} }; 例2 int a[4][3]={ {1,2}, {4,5}, {7}, {10} };此例中系统自动给空缺的地方补0例3 int a[4][3]={ {1,2}, {4,5} };系统自动给后面的行补初值0例4 int a[4][3]={1, 2, 4, 5};此例中数组a的第一行中元素和第二行的第一个元素依次为1,2,4,5其余全部为0知识点三定义二维数组大小例1 int a[ ][3]={ { 1,2,3}, {4,5}, {6}, {8} };有4个行花括号,因此说明是4行3列。

例2 int a[ ][3]={1, 2, 3, 4, 5};这种方式计算规则:1)第二维数值能被初值个数整除第一维数=商数2)第二维数值不能被初值个数整除第一维数=商数+1因此上例中表示一个2行3列数组。

知识点四二维数组应用例1 从键盘上输入5个学生3门课程的成绩,分别计算每个学生的平均分和每门课程的平均分。

#include<stdio.h>#define M 5#define N 3main(){int a[M][N],i,j,sum;printf("请输入15个分数(0-100):\n");for(i=0;i<=M-1;i++)for(j=0;j<=N-1;j++)scanf("%d",&a[i][j]);printf("每个学生的平均分\n");for(i=0;i<=M-1;i++){sum=0;for(j=0;j<=N-1;j++)sum=sum+a[i][j];printf("%4d",sum/N);}printf("\n");printf("每门课程的平均分\n");for(i=0;i<=N-1;i++){sum=0;for(j=0;j<=M-1;j++)sum=sum+a[j][i];printf("%4d",sum/M);}}例2 从键盘上输入一个4行4列整数矩阵,输出左上至右下对角线元素之和。

#include<stdio.h>#define M 4#define N 4main(){int a[M][N],i,j,sum=0;printf(“请输入16个整数:\n”);for(i=0;i<=M-1;i++)for(j=0;j<=N-1;j++)scanf("%d",&a[i][j]);for(i=0;i<=M-1;i++)sum=sum+a[i][i];printf("%d",sum);}练习题1 从键盘上输入一个4行4列的整数矩阵。

输出此矩阵右上至左下对角线元素之和。

2 从键盘上输入一个4行4列的整数矩阵。

输出此矩阵下半三角形的所有元素之和。

3 从键盘上输入一个4行4列的整数矩阵。

输出此矩阵最外围元素之和。

指针第1课知识点一定义一级指针格式: 类型名*变量名例1 定义两个指向整型变量的指针p1和p2。

int *p1, *p2;例2 定义两个整型变量m和n及两个指针p和q,并使p和q分别指向m和n。

int m, n, *p, *q;p=&m; 表示p存放变量m的地址q=&n; 表示q存放变量n的地址例3 定义一个包含10个整数的数组a和一个指针p,并使p指向a。

int a[10], *p;p=a; 表示p指向数组a的首地址,即a[0]的地址。

注意: 例3中p=a不能写成p=&a,因为a本身就是地址。

知识点二定义二级指针格式: 类型名**变量名假设已有下列定义:int **p, *s, k=0;例如: s=&k; 指针s指向变量k的地址p=&s; 指针p指向指针s的地址此时p为指向指针的指针,即二级指针。

知识点三指针间的赋值假设已有下列定义:int *q, *p, k=0;q=&k;例如: p=q; 表示两指针间赋值,读作p指向q。

此时p和q均指向变量k的地址。

知识点四空指针在C语言中空值用NULL表示,其值为0定义指针时可以给指针赋值NULL例如: int *p=NULL; 表示p没有指向任何地址等价于p=’\0’; 或p=0;注意: 此时指针p没有实际单元,所以暂时不能访问。

例如: int *p=NULL;printf(“%d”,*p); 此语句会产生出错信息第2课知识点一通过指针引用存储单元假设已有下列定义:int *p, m, n=0;p=&n;例如: m=*p; 表示将p指向存储单元内容给变量m 等价于m=n;*p=*p+1; 等价于n=n+1;注意: *p=*p+1; 还可以写成下面的形式*p+=1; 或++*p; 或(*p)++;知识点二指针的移动当指针指向一片连续空间时,移动才有意义。

假设已有下列定义:int a[5], *p, *q, k;p=a;例如: q=p+2; 表示将q指向元素a[2]的地址p++; 表示将p向后移一个单元q--; 表示将q向前移一个单元k=p[2]; 等价于k=a[3];知识点三指针的比较若两指针指向一片连续空间,可比较大小。

假设已有下列定义:int a[10], *p, *q, k;p=a;q=p+2;例如: if( p<q) printf(“p小于q”);由于条件成立,所以输出p小于q。

k=q-p; 表示p和q相差的地址值最后k值为2第3课知识点一指向数组的指针假设已有下列定义:int *p, *q, k;int a[3][3];例如: p=&a[2][2]; 表示p指向元素a[2][2]的地址p=a[1]; 表示p指向数组a第二行的首地址p++; 此时p指向元素a[1][1]的地址k=p[2]; 等价于k=a[2][0];q=p-3; 此时q指向元素a[0][1]的地址k=q[1]; 等价于k=a[0][2];(*p)++; 此时元素a[1][1]的值加1*q++; 此时q后移一个单元,a[0][1]值不变。

k=*(a[1]+2); 等价于k=a[1][2];指针数组格式: 类型名*变量名[元素个数]假设已有下列定义:int *p[3], a[3][2], k;此例中p是一个指针数组,包含3个元素,每个元素均为一个指向int类型的指针。

将指针数组和二维数组关联for(k=0;k<=2;k++) p[k]=a[k];此时p[0]、p[1]、p[2]分别指向数组a每行的首地址。

例如: p[0]=a[0]; 表示p[0]指向数组a第一行首地址p[0]++; 此时p[0]指向元素a[0][1]的地址k=*(p[1]+1); 等价于k=a[1][1];k=p[2][1]; 等价于k=a[2][1];注意: p[k]和a[k]的区别p[k]和a[k]两者均表示数组a第k+1行的首地址。

p[k]能被赋值,而a[k]是地址常量,不能被赋值。

例如: a[0]=p[0]; 此语句非法,应改为p[0]=a[0];指针的应用例1 从键盘上输入两个整数,输出较大数。

(要求使用指针)#include<stdio.h>main(){int a,b,*p,*q;p=&a;q=&b;printf("请输入两个整数:\n");scanf("%d%d",p,q);if(*p>*q)printf("%d",*p);elseprintf("%d",*q);}例2 从键盘上输入10个整数,输出最大数和最小数。

相关文档
最新文档