c语言的基础整理(详细阐述指针数组)
C语言知识点归纳

(1)、 % : 要求运算对象为整数 (2)、条件运算符: ? : (3)、自增(减):自增自减只适用于变量,不适用于常量和表达式 (4)、a++: 先使用 a,然后再加 1, ++a 相反 (5)、指针*: 取指针所指向的变量的值 (6)、复合赋值:结合方向为自右向左 如 a=6 求 a+=a*=a%4
第七章 函数
一、函数不能嵌套定义,可以嵌套调用 二、函数的定义一般格式
函数类型 函数名(形参类型说明表) {
声明部分 语句部分 }
4
三 、形参与实参 形式参数:定义函数时函数名后面括号中的变量名 实际参数:调用函数时函数名后面括号中的表达式
说明: 实参必须有确定的值 形参必须指定类型 形参与实参类型一致,个数相同 若形参与实参类型不一致,自动按形参类型转换———函数调用转换 形参在函数被调用前不占内存;函数调用时为形参分配内存;调用结束,内存释 放
的判断与执行。
第六章 数组
一、数组概念: 数组是类型相同的数据的集合。其中每个数据称为元素。元素由统一的数组名和标识其
位置的下标来唯一地确定。 二、数组定义方法
如一维数组 int a[10]; 二维数组:int a[2][3] 在内存分配若干连续空间给数组 注意:常量表达式用方括弧括起来;[ ]中是常量或常量表达式 常量表达式为数组元素个数,即数组长度;其值从 0 开始. 数组类型为数组中每一个元素类型 三 、数组初始化方法 int a[3]={3,5,7} int a[2][3]={{1,2,3},{4,5,6}} 四、 数组的输入、输出方法: (1)、一维 单循环 如 for(i=0;i<10;i++)
计算机编程基础—c语言

计算机编程基础—c语言
C语言是一种通用、高级的编程语言,它由贝尔实验室的Dennis Ritchie在20世纪70年代初期发明。
与其他编程语言
相比,C语言的语法非常简单,同时也支持底层的操作,使得
其成为了系统编程和嵌入式开发中最常用的语言之一。
C语言可以用于开发各种类型的程序,从简单的命令行工具到
大型的应用程序和操作系统。
它的编译器可在多种操作系统上运行,例如Windows、Linux和Mac OS等。
以下是C语言编程中的基础概念:
1. 变量:变量用于存储数据,可以是各种类型的数据,例如整数、浮点数、字符等。
2. 数据类型:C语言提供了多种数据类型,例如int、float、char等。
3. 运算符:运算符用于执行算术、逻辑和位操作,例如+、-、*、/等。
4. 控制结构:C语言支持多种控制结构,例如条件语句(if-else)、循环语句(for、while、do-while)和跳转语句(break、continue、goto)等。
5. 函数:函数是C语言中组织代码的基本单元,它可以接受
参数,执行特定的操作,并返回值。
6. 数组:数组可以用于存储一组相同类型的数据,可以是一维或多维的。
7. 指针:指针用于存储内存地址,C语言中的许多高级功能都使用指针。
8. 结构体:结构体可以将多个数据项组合成一个整体,方便在程序中处理。
C语言的学习需要通过实践来掌握,建议通过编写简单的程序开始,逐渐提高难度和复杂度,来提高编程水平。
C语言基础 第7章 数组

一维数组: float mark[100];
低地址
每个数据元素占用 的字节数,就是基
类型的字节数 一个元素占4个字节
高地址
86.5 mark[0]
92.0 mark[1]
77.5 mark[2]
52.0 mark[3]
.
.
.
.
.
.
94.0
mark[99]
第7章 数组
7.1.2 一维数组的初始化 ❖ 初始化:在定义时指定初始值,编译器把初值
例:int a[10] = {0,1,2,3,4}; 仅前5个元素赋初值,后5个元素自动赋为0。 3、全部元素均初始化为0,不允许简写。 int a[10] = {0,0,0,0,0,0,0,0,0,0}; 不能写成:int a[10]={0*10};
第7章 数组
❖ 不能简写为:
❖ static int a[10] = {0*10};
第7章 数组
❖ 注意: 2)C语言不允许对数组的大小做动态定义, 如:
❖ int n;
❖ scanf("%d",&n);
❖ int a[n]; ❖ 因为在编译时,C编译器根据已知数组大
小分配内存。//只针对全局变量
❖ 说明:
1)数组名:按标识符规则。本例a就是数 组名。
2)整型常量表达式:表示数组元素个数 (数组的长度)。可以是整型常量或符 号常量,不允许用变量。整型常量表达 式在说明数组元素个数的同时也确定了 数组元素下标的范围,下标从0开始~整 型常量表达式-1(注意不是1~整型常量 表达式)。
7.1.3 数组元素的引用
❖ C语言规定,不能引用整个数组,只能逐 个引用元素,元素引用方式:
计算机基础知识c语言

计算机基础知识c语言C语言是一种广泛应用于计算机科学和编程领域的编程语言。
它被设计用于编写操作系统、嵌入式系统以及其他需要高性能计算的应用程序。
以下是一些关于C 语言基础知识的要点:1. 语法结构:C语言的语法结构主要由函数、变量、控制结构(如分支语句和循环语句)以及数据类型组成。
了解这些基本的语法元素对于编写有效的C程序非常重要。
2. 变量和数据类型:C语言提供了不同的数据类型,如整型、浮点型、字符型等。
在使用变量之前,需要先声明其数据类型,并为其分配内存空间。
此外,C语言还提供了一些基本的运算符,如加、减、乘、除等。
3. 控制结构:C语言支持多种控制结构,如条件语句(如if-else语句)和循环语句(如for循环和while循环)。
通过使用这些控制结构,可以根据程序的需求进行不同的判断和重复执行。
4. 函数:函数是C语言中的基本构建块之一。
函数可以接收参数和返回值,并通过将复杂的任务分解为较小的模块来提高代码的可读性和维护性。
5. 数组和指针:C语言支持数组和指针,这些数据结构对于处理大量数据或访问内存中的特定位置非常有用。
了解如何使用数组和指针可以提高程序的效率和灵活性。
6. 文件IO操作:C语言提供了使用文件进行输入和输出操作的函数。
这些函数允许你读取和写入文件,以及在程序中进行文件的操作。
7. 内存管理:C语言要求手动进行内存管理,包括动态内存分配和释放。
了解如何正确地分配和释放内存是编写高效和可靠程序的关键。
总结起来,了解C语言的基础知识对于理解计算机编程的基本概念和原理非常重要。
掌握这些基本知识将为你进一步学习和使用C语言打下坚实的基础。
c语言函数返回指针数组

c语言函数返回指针数组C语言是一种非常强大和灵活的编程语言,它提供了多种数据类型和函数操作,以便开发人员能够实现各种复杂的任务。
在C语言中,函数可以返回各种类型的数据,包括指针,这使得我们能够使用返回的指针进行更多的操作和处理。
函数返回指针数组是C语言中一个非常有用的概念。
通过返回指针数组,我们可以动态地分配内存并返回一个指向该数组的指针,从而使得数据的操作更加灵活。
下面我们将深入探讨函数返回指针数组的用法和指导意义。
首先,函数返回指针数组可以用于返回多个值。
在一些情况下,我们需要在函数中计算多个值并将其返回给调用者。
使用指针数组可以很方便地解决这个问题。
通过定义一个指针数组,我们可以在函数中为每个返回值分配内存,并将其保存在数组中,然后返回指向数组的指针。
这样,调用者就可以通过解引用该指针来获得函数返回的多个值。
其次,函数返回指针数组还可以用于动态内存分配。
在某些情况下,我们不知道需要分配多少内存来存储数据。
通过返回指针数组,我们可以在运行时动态地分配所需的内存,并通过指针数组将其返回。
这使得程序的内存管理更加高效和灵活。
另外,函数返回指针数组还能提供更好的代码重用性和模块化。
通过将一些通用的功能封装在函数中,并返回指针数组,我们可以将这个函数作为一个模块在多个程序中进行复用。
这样,我们可以减少代码的重复编写,并提高代码的可维护性和可扩展性。
在实际应用中,函数返回指针数组的使用有很多场景。
比如在图像处理中,我们可以编写一个函数来读取图像文件,并返回一个指针数组,其中每个指针指向一幅图像的像素数据。
通过这个函数,我们可以在程序中只调用一次,并将返回的指针数组传递给其他函数进行图像处理操作,这样可以节省内存和提高运行效率。
此外,函数返回指针数组还可以用于处理多个文本字符串。
通过定义一个指针数组,我们可以在函数中为每个字符串分配内存,并将其保存在数组中。
这样,在程序中我们可以通过解引用指针数组来获取每个字符串,并进行进一步的处理,比如字符串拼接、比较和排序等。
C语言中数组的总结

C语言中数组的总结目录1.数组的定义2.一维数组的创建和初始化3.给数组元素赋值4.数组下标越界5.二维数组6.多维数组7.指针与一维数组8.指针与多维数组9.指针,数组与函数10.变长数组11.以上全部内容数组的定义1.数组:一系列相同数据类型的有序序列。
2.声明数组:int states[50];char code[28];float candy[13]; 等等……通过声明将会告知编译器三个信息:1)数组内含有多少元素2)元素的数据类型3)数组名一维数组的创建和初始化1.数组的初始化:在数组创建时,我们要为数组初始化。
int months[12]={31,28,31,30,31,30,31,31,30,31,30,31};//数组的初始化int months[ ]={ 31,28,31,30,31,30,31,31,30};//初始化时省略方括号中的数字,编译器会根据初始化列表中项数来确定数组的大小。
(本例中数组的大小为9)const int months[12]={31,28,31,30,31,30,31,31,30,31,30,31};//将数组设置为只读,这样程序只能从数组中检索值,不能把新值写入数组。
(一旦声明为const,便不能再给他赋值)以花括号括起来,用逗号分隔数组元素来初始化数组,逗号和值之间可以使用空格。
C const 与C++ const区别一:c++允许在声明数组时使用const整数变量,而c不允许。
区别二:const定义的变量未初始化时,c会使用一个变量地址上的随机的值,c++会报错未初始化的const 'y'。
区别三:const int y;const int *p2 =&y;int * p1;p1 = p2;//c++不允许这么做(从'const int*'到'int*' [- fper]的无效转换),c 会给出一个警告(赋值从指针目标类型中丢弃“const”限定符)1)失败的初始化数组a)未初始化数组:数组元素和未初始化的普通变量一样,编译器使用的值是内存地址上现有的值,使得数组储存的都是垃圾值。
c语言数组的使用方法
c语言数组的使用方法一、概述C语言是一种非常重要的编程语言,它拥有强大的数组功能。
数组是一种特殊的变量类型,它可以存储多个相同类型的数据。
在C语言中,数组是一个连续的内存块,每个元素都有一个唯一的下标值,可以通过下标值来访问特定元素。
本文将详细介绍C语言中数组的使用方法,包括如何定义数组、初始化数组、访问数组元素等。
二、定义数组在C语言中,定义一个数组需要指定以下三个参数:1.数据类型:表示该数组可以存储哪种类型的数据。
2.数组名称:表示该数组在程序中被引用时使用的名称。
3.元素数量:表示该数组可以存储多少个元素。
例如,以下代码定义了一个名为numbers的整数类型数组,它可以存储10个整数:int numbers[10];三、初始化数组在定义一个数组后,我们可以对其进行初始化。
初始化就是为每个元素赋予初始值。
以下是几种常见的初始化方法:1.使用大括号{}来初始化所有元素:int numbers[5] = {1, 2, 3, 4, 5};2.省略大括号{}来初始化部分元素:int numbers[5] = {1, 2, 3};//numbers[0] = 1,numbers[1] = 2,numbers[2] = 3,numbers[3] = 0,numbers[4] = 03.使用循环来初始化数组:int numbers[5];for(int i=0; i<5; i++){numbers[i] = i+1;}四、访问数组元素在C语言中,可以通过下标值来访问数组元素。
下标值从0开始,到数组长度-1结束。
以下是几种常见的访问数组元素的方法:1.使用下标值来访问单个元素:int numbers[5] = {1, 2, 3, 4, 5};printf("%d", numbers[2]); //输出:32.使用循环来遍历整个数组:int numbers[5] = {1, 2, 3, 4, 5};for(int i=0; i<5; i++){printf("%d ", numbers[i]);}//输出:1 2 3 4 5五、多维数组在C语言中,还可以定义多维数组。
c语言5
5.1.3 与指针有关的运算
例5-2 分析下列程序的输出结果。
#include <stdio.h> void main( ) { char a[5]="1234"; char *p; p=a; /*指针变量p指向数组的第一个元素a[0]*/ printf("%d\n",*p); /*输出第一个元素的ASCII值*/ p++; /*指针变量p指向数组的第二个元素a[1]*/ printf("%d\n",*p); /*输出第二个元素的ASCII值*/ }
指针是一种数据类型。 指针是指存放数据的 内存地址 。程序中定义的 变量、数组都要分配内存空间,通过这些空间的地 址可以访问存储在其中的数据,也就是引用变量或 数组元素。可以看出,指针提供了访问数据的另一 种方法(通过变量名访问数据是一种)。
5.1.1 指针的概念
“指针”是个地址概念,是指内存储器中存储单元的地 址。变量在内存中使用存储空间的起始地址,称为该变量 的指针,如图所示。
又:一维数组元素的指针法引用 *(x+i) 与 x[i]等价, 所以,二维数组元素的指针引用法形式为: *(*(x+i)+j) 例5-5 使用指针的方法,输出二维数组的元素。 void main() { int x[3][4]={1,2,3,4,5,6,7,8,9,10,11,12}; int i,j; for(i=0;i<3;i++) { for(j=0;j<4;j++) printf("%5d",*(*(x+i)+j)); printf("\n"); } }
5.1.3 与指针有关的运算
《C语言程序设计》第5章数组、字符串、指针
相当于声明了5个整型变量
说明: ① 数组的所有元素的数据类型都是相同的。 ② 数组取名规则应符合标识符的规定,数组 名不能与同一函数中其它变量名相同: int a; float a[10]; 是错误的。
③ C语言中规定数组的下标从0开始,方括号 中常量表达式表示数组元素的个数。
④ 不能在方括号中用变量来表示元素的个数, 但是可以是符号常数或常量表达式。例如: int n=5,a[n]; 是错误的。
二维数组在内存的存放顺序是“先行后列”
a[0][0] a[0][1] a[0][2] a[0][3] a[1][0]
…
a[2][3]
5.3.2 二维数组元素的引用
二维数组的元素的引用形式为: 数组名[下标][下标] 使用二维数组的情况举例: 学生多门功课的成绩,如: a[100][3]可以用来记录100个学生3门功 课的成绩。 矩阵,如: a[3][3]可以用来记录3×3的矩阵。一个 数组元素正好存放一个矩阵的元素。
5.2.2 一维数组的初始化
1、数组声明时初始化 在编译阶段进行的。这样将减少运行时间, 提高效率。 数组初始化的一般形式为: 类型符 数组名[常量表达式]={值,值…值}; 例如: int a[10]={ 0,1,2,3,4,5,6,7,8,9 }; 相当于a[0]=0; a[1]=1;... a[9]=9;
…
a[9]
#include <stdio.h> 声明有10个元素 void main() 的一维数组a {int n,i; float s=0, ave, a[10]; a[0] a[1] … a[9] for(i=0;i<10;i++) a[i] { scanf("%f",&a[i]); a[i] s=s+a[i]; } ave=s/10; for(i=0;i<10;i++) a[i] a[i] if (a[i]>ave) printf("%f ",a[i]); }
明解c语言入门篇第三版
C语言入门篇第三版C语言是一种广泛使用的编程语言,它被广泛用于操作系统、编译器、数据库和其他高性能应用程序的开发。
C语言的语法简单、清晰、易懂,易于学习,是编程初学者入门的首选语言。
本文将介绍C语言入门篇第三版,包括基本语法、数据类型、运算符、流程控制语句、数组、函数、指针等内容。
一、基本语法C语言的基本语法包括标识符、关键字、注释、语句和函数等。
其中,标识符是指变量、函数、数组等的名称,关键字是C语言中具有特定含义的单词,注释是用于说明代码的文字,语句是C语言中的执行单位,函数是C语言中的基本组成部分。
二、数据类型C语言中的数据类型包括整型、浮点型、字符型、布尔型等。
其中,整型包括short、int、l ong、long long等类型,浮点型包括float、double等类型,字符型包括char类型,布尔型包括bool类型。
三、运算符C语言中的运算符包括算术运算符、关系运算符、逻辑运算符、位运算符等。
其中,算术运算符包括加、减、乘、除、取模等运算符,关系运算符包括等于、不等于、大于、小于等运算符,逻辑运算符包括与、或、非等运算符,位运算符包括按位与、按位或、按位异或等运算符。
四、流程控制语句C语言中的流程控制语句包括条件语句、循环语句、跳转语句等。
其中,条件语句包括if 语句、if-else语句、switch语句等,循环语句包括while语句、do-while语句、for语句等,跳转语句包括break语句、continue语句、goto语句等。
五、数组C语言中的数组是一种存储相同类型数据的容器,可以通过下标访问数组中的元素。
数组的定义包括数组类型、数组名称、数组长度等。
六、函数C语言中的函数是一种独立的代码单元,可以实现特定的功能。
函数的定义包括函数类型、函数名称、函数参数等。
七、指针C语言中的指针是一种特殊的变量类型,可以存储另一个变量的地址。
指针的定义包括指针类型、指针名称等。
总之,C语言入门篇第三版是C语言学习的基础,掌握好基本语法、数据类型、运算符、流程控制语句、数组、函数、指针等内容,可以为后续的C语言学习打下坚实的基础。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
C语言中堆和栈的区别 一.前言: C语言程序经过编译连接后形成编译、连接后形成的二进制映像文件由栈,堆,数据段(由三部分部分组成:只读数据段,已经初始化读写数据段,未初始化数据段即BBS)和代码段组成,如下图所示:
1.栈区(stack):由编译器自动分配释放,存放函数的参数值,局部变量等值。其操作方式类似于数据结构中的栈。 2.堆区(heap):一般由程序员分配释放,若程序员不释放,则可能会引起内存泄漏。注堆和数据结构中的堆栈不一样,其类是与链表。 3.程序代码区:存放函数体的二进制代码。 4.数据段:由三部分组成: 1>只读数据段: 只读数据段是程序使用的一些不会被更改的数据,使用这些数据的方式类似查表式的操作,由于这些变量不需要更改,因此只需要放置在只读存储器中即可。一般是const修饰的变量以及程序中使用的文字常量一般会存放在只读数据段中。 2>已初始化的读写数据段: 已初始化数据是在程序中声明,并且具有初值的变量,这些变量需要占用存储器的空间,在程序执行时它们需要位于可读写的内存区域内,并且有初值,以供程序运行时读写。在程序中一般为已经初始化的全局变量,已经初始化的静态局部变量(static修饰的已经初始化的变量) 3>未初始化段(BSS): 未初始化数据是在程序中声明,但是没有初始化的变量,这些变量在程序运行之前不需要占用存储器的空间。与读写数据段类似,它也属于静态数据区。但是该段中数据没有经过初始化。未初始化数据段只有在运行的初始化阶段才会产生,因此它的大小不会影响目标文件的大小。在程序中一般是没有初始化的全局变量和没有初始化的静态局部变量。 二.堆和栈的区别 1.申请方式 (1)栈(satck):由系统自动分配。例如,声明在函数中一个局部变量int b;系统自动在栈中为b开辟空间。 (2)堆(heap):需程序员自己申请(调用malloc,realloc,calloc),并指明大小,并由程序员进行释放。容易产生memory leak(内存泄漏也称作“存储渗漏”,用动态存储分配函数动态开辟的空间,在使用完毕后未释放,结果导致一直占据该内存单元。直到程序结束。即所谓内存泄漏。 ). eg:char p; p = (char *)malloc(sizeof(char)); 但是,p本身是在栈中。 2.申请大小的限制 (1)栈:在windows下栈是向底地址扩展的数据结构,是一块连续的内存区域(它的生长方向与内存的生长方向相反)。栈的大小是固定的。如果申请的空间超过栈的剩余空间时,将提示overflow。 (2)堆:堆是高地址扩展的数据结构(它的生长方向与内存的生长方向相同),是不连续的内存区域。这是由于系统使用链表来存储空闲内存地址的,自然是不连续的,而链表的遍历方向是由底地址向高地址。堆的大小受限于计算机系统中有效的虚拟内存。 3.系统响应: (1)栈:只要栈的空间大于所申请空间,系统将为程序提供内存,否则将报异常提示栈溢出。 (2)堆:首先应该知道操作系统有一个记录空闲内存地址的链表,但系统收到程序的申请时,会遍历该链表,寻找第一个空间大于所申请空间的堆结点,然后将该结点从空闲链表中删除,并将该结点的空间分配给程序,另外,对于大多数系统,会在这块内存空间中的首地址处记录本次分配的大小,这样,代码中的free语句才能正确的释放本内存空间。另外,找到的堆结点的大小不一定正好等于申请的大小,系统会自动的将多余的那部分重新放入空闲链表中。 说明:对于堆来讲,对于堆来讲,频繁的new/delete势必会造成内存空间的不连续,从而造成大量的碎片,使程序效率降低。对于栈来讲,则不会存在这个问题, 4.申请效率 (1)栈由系统自动分配,速度快。但程序员是无法控制的 (2)堆是由malloc分配的内存,一般速度比较慢,而且容易产生碎片,不过用起来最方便。 5.堆和栈中的存储内容 (1)栈:在函数调用时,第一个进栈的主函数中后的下一条语句的地址,然后是函数的各个参数,参数是从右往左入栈的,然后是函数中的局部变量。注:静态变量是不入栈的。 当本次函数调用结束后,局部变量先出栈,然后是参数,最后栈顶指针指向最开始存的地址,也就是主函数中的下一条指令,程序由该点继续执行。 (2)堆:一般是在堆的头部用一个字节存放堆的大小。 (3) 6.存取效率 (1)堆:char *s1=”hellow tigerjibo”;是在编译是就确定的 (2)栈:char s1[]=”hellow tigerjibo”;是在运行时赋值的;用数组比用指针速度更快一些,指针在底层汇编中需要用edx寄存器中转一下,而数组在栈上读取。 补充: 栈是机器系统提供的数据结构,计算机会在底层对栈提供支持:分配专门的寄存器存放栈的地址,压栈出栈都有专门的指令执行,这就决定了栈的效率比较高。堆则是C/C++函数库提供的,它的机制是很复杂的,例如为了分配一块内存,库函数会按照一定的算法(具体的算法可以参考数据结构/操作系统)在堆内存中搜索可用的足够大小的空间,如果没有足够大小的空间(可能是由于内存碎片太多),就有可能调用系统功能去增加程序数据段的内存空间,这样就有机会分到足够大小的内存,然后进行返回。显然,堆的效率比栈要低得多。 7.分配方式: (1)堆都是动态分配的,没有静态分配的堆。 (2)栈有两种分配方式:静态分配和动态分配。静态分配是编译器完成的,比如局部变量的分配。动态分配由alloca函数进行分配,但是栈的动态分配和堆是不同的。它的动态分配是由编译器进行释放,无需手工实现。 关于数组指针在堆栈中的体现: 字符型数组初始化 char str[30]="ksjdkghdksf"; 将其存在栈中 str是一个数组元素首地址(属于常量不可更改) 不能进行str++; 数组里面的内容是一个字符串
a与&a输出的结果相同,但a为数组元素的首地址,而&a为整个数组的首地址 即:(*(a+1) != *(&a+1)) 数组中的a++无法通过编译,左值错误,可见a是个常量不可改变 而(*a)++是可以改变的代表该字符串的不是存在只读数据段中,其中的数值可以改变 数组为静态分配内存,存储空间的释放都是由操作系统自动释放的(与malloc需要free不同) 数组分为:整型数组,字符型数组,浮点型数组,指向整型的指针数组...... 存储的数据数组前面的名字; int *a[10]其中存放的都是指向整型的指针,如&b,&d。 字符型指针初始化: char * pstr="aslgkjklahjkla"; 初始时候pstr指向a; pstr++后pstr指向了s(可见与数组不同pstr是个指针变量可以改变的) pstr是指向字符串常量的首地址的指针,编译器将字符串常量放在只读数据段.(只读数据段里面的数据是不可更改的.)即:(*pstr)++会报出段错误 pstr初始化时候可以指向NULL,NULL不可以访问会报段错误 注意:当数组名或者指针作为参数传输时候,都作为指针传输
指针是c语言的灵魂,关于指针的详细概述: int p; //这是一个普通的整型变量
int *p; //首先从P 处开始,先与*结合,所以说明P 是一 //个指针,然后再与int 结合,说明指针所指向 //的内容的类型为int 型.所以P 是一个返回整 //型数据的指针
int p[3]; //首先从P 处开始,先与[]结合,说明P 是一个数 //组,然后与int 结合,说明数组里的元素是整 //型的,所以P 是一个由整型数据组成的数组
int *p[3]; //首先从P 处开始,先与[]结合,因为其优先级 //比*高,所以P 是一个数组,然后再与*结合,说明 //数组里的元素是指针类型,然后再与int 结合, //说明指针所指向的内容的类型是整型的,所以 //P 是一个由返回整型数据的指针所组成的数组
int (*p)[3]; //首先从P 处开始,先与*结合,说明P 是一个指针 //然后再与[]结合(与"()"这步可以忽略,只是为 //了改变优先级),说明指针所指向的内容是一个 //数组,然后再与int 结合,说明数组里的元素是 //整型的.所以P 是一个指向由整型数据组成的数 //组的指针
int **p; //首先从P 开始,先与*结合,说是P 是一个指针,然 //后再与*结合,说明指针所指向的元素是指针,然 //后再与int 结合,说明该指针所指向的元素是整 //型数据.由于二级指针以及更高级的指针极少用 //在复杂的类型中,所以后面更复杂的类型我们就 //不考虑多级指针了,最多只考虑一级指针.
int p(int); //从P 处起,先与()结合,说明P 是一个函数,然后进入 //()里分析,说明该函数有一个整型变量的参数 //然后再与外面的int 结合,说明函数的返回值是 //一个整型数据 Int (*p)(int); //从P 处开始,先与指针结合,说明P 是一个指针,然后与 //()结合,说明指针指向的是一个函数,然后再与()里的 //int 结合,说明函数有一个int 型的参数,再与最外层的 //int 结合,说明函数的返回类型是整型,所以P 是一个指 //向有一个整型参数且返回类型为整型的函数的指针 //注意(这个不是函数,其本质是一个指针!) int *p(int);//其本质为一个函数,与int p(int)类似,区别在于int *p(int);的返回值是个指针! //一般用于改变指针的指向时使用,可以避免多级指针的频繁使用
int *(*p(int))[3]; //可以先跳过,不看这个类型,过于复杂 //从P 开始,先与()结合,说明P 是一个函数,然后进 //入()里面,与int 结合,说明函数有一个整型变量 //参数,然后再与外面的*结合,说明函数返回的是 //一个指针,,然后到最外面一层,先与[]结合,说明 //返回的指针指向的是一个数组,然后再与*结合,说 //明数组里的元素是指针,然后再与int 结合,说明指 //针指向的内容是整型数据.所以P 是一个参数为一个 //整数据且返回一个指向由整型指针变量组成的数组 //的指针变量的函数. 说到这里也就差不多了,我们的任务也就这么多,理解了这几个类型,其它 的类型对我们来说也是小菜了,不过我们一般不会用太复杂的类型,那样会 大大减小程序的可读性,请慎用,这上面的几种类型已经足够我们用了. 1、细说指针 指针是一个特殊的变量,它里面存储的数值被解释成为内存里的一个地址。 要搞清一个指针需要搞清指针的四方面的内容:指针的类型、指针所指向的 类型、指针的值或者叫指针所指向的内存区、指针本身所占据的内存区。让 我们分别说明。 先声明几个指针放着做例子: 例一: (1)int*ptr; (2)char*ptr; (3)int**ptr; (4)int(*ptr)[3]; (5)int*(*ptr)[4]; 1.指针的类型 从语法的角度看,你只要把指针声明语句里的指针名字去掉,剩下的部 分就是这个指针的类型。这是指针本身所具有的类型。让我们看看例一中各 个指针的类型: (1)int*ptr;//指针的类型是int* (2)char*ptr;//指针的类型是char* (3)int**ptr;//指针的类型是int** (4)int(*ptr)[3];//指针的类型是int(*)[3]