C语言要点总结
- 格式:doc
- 大小:3.28 MB
- 文档页数:90
c语言知识点大纲以下是C语言的知识点大纲,适用于初学者和中级水平的学习者:基础概念1.数据类型:整型、浮点型、字符型等2.变量和常量:声明、定义、初始化3.运算符:算术、关系、逻辑、赋值等4.控制流:条件语句(if-else)、循环语句(for、while、do-while)5.函数:声明、定义、调用、参数传递、递归6.数组:声明、初始化、访问、多维数组、数组与指针关系7.指针:地址、指针变量、指针运算、指针和数组、指针和函数8.字符串:字符数组、字符串处理函数、字符串常用操作9.结构体:定义、访问结构成员、结构体数组、结构体指针高级概念10.内存管理:动态内存分配((malloc、calloc、realloc、free)、内存泄漏和内存错误11.文件操作:文件读写、文件指针、文件操作函数12.预处理器:宏定义、条件编译、头文件13.位运算:位操作、位掩码、位运算符14.函数指针:指向函数的指针、回调函数高级主题15.数据结构:链表、栈、队列、树、图等16.算法:排序算法((冒泡排序、快速排序等)、搜索算法((线性搜索、二分搜索等)17.指针与内存:内存布局、内存对齐、指针算术18.多线程编程:线程、同步与互斥、线程安全性19.网络编程:Socket编程、TCP/IP、HTTP协议20.C标准库函数:常用函数库((stdio.h、stdlib.h、string.h(等)实践和应用21.项目开发:使用C语言构建小型项目或工具22.调试和优化:学习调试技巧、代码优化技巧以上列举的知识点可以帮助你建立起对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语言编程总结第1篇为期一周的C语言实验室实践学习已经结束,这是对自己上学期的C语言学习的检验,同时也对于旧知识、旧思路的复习理解提供了很好的机会。
于其中的.漫漫路也是给了我许多感触。
(1)“独木不成林”。
单凭个人力量若要有所成就着实不易。
即便非大成功,就C语言程序的设计而言,若仅个人之力,有些问题想破脑袋仍无结果,有时却只需老师、同学轻轻一点便迎刃而解。
不仅效率可大大提高,亦能增进与人交流机会,促进彼此情感。
反之,倘若一个人独立行走,就可能走极端,反思路做题,结果显而易见。
(2)细心方面仍是一个大问题。
一次次“运行失败”其实更多是因粗心引起。
仅小小的分号,就不知漏了几次。
抑或是少了个括号,少了个等号,便显示程序无法运行或者进入了死循环。
很多时候,碎小的个体会影响到整个工程效果。
所谓“牵一发而动全身”,C语言编程是这个理,而生活很多其他问题不也是如此吗?(3)“锲而不舍,金石可镂”。
很多题目需要靠坚持才能有结果。
一次次编写的程序无法运行,一次次的改正无法获得”编译成功“的认可,心情有多糟无需多说。
此时倘若将其放掉,那这个题目可能就永远被埋掉了,那些错误之处也就再无机会得到修正,那个知识点也可能从此漏了。
(4)同时还更为深刻理解了模块化编程的重要意义。
以模块化方式考虑程序结构,以函数形式书写复杂的程序是C语言编程的重要思路。
不仅利于错误检查,也大大提高了速率。
(5)需注意巩固过往知识,熟悉它们的用途。
就如函数f4(题9)程序的编写,原本在判断两数是否为质数时只需用“&&”就能很好解决,实际编写中却用了分开判断的思路,使得问题变复杂了,程序编写自然困难了许多。
坦白说,刚开始得知还有个C语言专周用来搞这个,心情一下子变灰色调了。
跟C语言不熟不说,就算懂,也是没什么兴趣的。
想起上学期,就它最折腾我的。
现在想来,倒觉得多亏了学校有这个安排。
不仅复习了一些基本知识,也大大提高了对C语言的兴趣。
C语言基础必须掌握的知识点C语言是一种通用的高级计算机编程语言,是学习其他编程语言的基础。
掌握C语言基础知识对于提升编程水平和解决实际问题非常重要。
本文将介绍C语言基础必须掌握的知识点。
1.基本语法:了解C语言的基本语法,包括标识符、关键字、注释、数据类型、变量、常量、运算符、表达式、语句、循环和条件语句等。
2.数据类型:掌握C语言中的基本数据类型,包括整型、浮点型、字符型和指针等。
了解它们的存储大小和范围,以及它们之间的转换。
3. 输入输出:了解C语言中的输入输出函数,包括scanf和printf 等。
掌握格式化输入输出的用法,以及如何进行输入和输出的格式控制。
4.数组:了解数组的概念和用法,包括一维数组和多维数组。
掌握数组的声明、初始化、访问和遍历等操作,以及数组和指针之间的关系。
5. 字符串:了解C语言中的字符串类型和常用的字符串处理函数,包括strlen、strcpy、strcat和strcmp等。
掌握字符串的输入和输出方法,以及字符串的常见操作。
6.函数:了解函数的概念和用法,包括函数的声明、定义、调用和返回值等。
掌握函数的参数传递方式,包括值传递和引用传递。
了解递归函数的原理和应用。
7.结构体:了解结构体的概念和用法,包括结构体的定义、访问和操作等。
掌握结构体数组和指针的使用,以及结构体和函数之间的关系。
8.文件操作:了解C语言中的文件操作函数,包括文件的打开、关闭、读取和写入等。
掌握文本文件和二进制文件的读写方法,以及文件指针的使用。
9. 动态内存管理:了解动态内存分配的原理和方法,包括malloc、calloc和realloc等函数的使用。
掌握内存的申请、释放和管理,防止内存泄漏和内存溢出。
10.指针:掌握指针的概念和用法,包括指针的声明、初始化、访问和操作等。
了解指针和数组、指针和函数之间的关系,以及指针的高级应用,如指向指针的指针和指针的运算。
11. 预处理器:了解C语言中的预处理器指令和宏定义,包括#include、#define和#ifdef等。
编程语言语法要点编程语言是计算机进行指令编写的工具,它们按照一定的语法规则组织和表达信息。
掌握编程语言的语法要点对于成为优秀的程序员至关重要。
本文将介绍几种常用编程语言的语法要点,包括C语言、Python和Java。
一、C语言语法要点C语言是一种通用的、高级的程序设计语言,应用广泛。
以下是C语言的语法要点:1. 变量类型和声明:在C语言中,变量的类型在声明时需要指定,如int、float、char等。
变量的声明通常位于函数开始之前,需要以分号结尾。
2. 语句和表达式:C语言中的语句以分号结尾,常见的语句包括赋值语句、条件语句和循环语句。
表达式用于计算并返回一个值,可以包含变量、运算符和函数调用。
3. 函数定义和调用:在C语言中,函数定义由函数头和函数体组成。
函数头指定函数的返回类型、函数名和参数列表。
调用函数时,需要提供与函数定义匹配的参数。
4. 控制流语句:C语言中的控制流语句包括条件语句和循环语句。
条件语句根据条件的真假来执行不同的代码块,常见的条件语句有if语句和switch语句。
循环语句用于重复执行一段代码,常见的循环语句有for循环、while循环和do-while循环。
二、Python语法要点Python是一种简洁而强大的解释型编程语言,具有易读易写的特点。
以下是Python的语法要点:1. 缩进和代码块:Python使用缩进来表示代码块,而不是使用花括号。
相同缩进级别的代码被视为同一个代码块。
2. 变量和数据类型:Python是动态类型语言,变量的类型由所存储的值决定。
常见的数据类型包括整型、浮点型、字符串和布尔型。
3. 控制流语句:Python的条件语句和循环语句与C语言类似,包括if语句、for循环和while循环。
需要注意的是,Python中的条件语句和循环语句末尾不需要使用分号。
4. 函数定义和调用:在Python中,函数定义使用关键字def,函数体缩进进行标识。
调用函数时,需要提供与函数定义匹配的参数。
c语言重点笔记C语言重点笔记一、基础语法1.注释:用于解释代码,不会被编译器执行。
单行注释以“//”开头,多行注释用“/* */”包围。
2.变量:用于存储数据。
定义变量时需要指定类型和名称,如int num;赋值时使用等号,如num=10;也可以在定义时进行赋值,如int num=10;3.数据类型:C语言提供了基本的数据类型,包括整型、浮点型、字符型等。
4.运算符:C语言提供了各种运算符,包括算术运算符、关系运算符、逻辑运算符等。
5.控制语句:C语言提供了各种控制语句,包括条件语句、循环语句等。
二、函数1.函数定义:函数是一段可重复使用的代码块。
定义函数需要指定返回值类型、函数名和参数列表。
如int add(int a, int b) { return a + b; }2.函数调用:调用函数时需要使用函数名和参数列表,并根据返回值类型进行接收。
如int result = add(1, 2);3.递归函数:递归是一种特殊的函数调用方式,在函数内部调用自身。
需要注意避免死循环。
三、数组1.数组定义:数组是一组相同类型的数据。
定义数组时需要指定类型和长度,如int arr[5];2.数组初始化:可以在定义时进行初始化,如int arr[5] = {1, 2, 3, 4, 5};3.数组访问:使用下标访问数组元素,下标从0开始,如arr[0]表示数组的第一个元素。
4.多维数组:多维数组是由一维数组组成的。
二维数组可以看作是一个矩阵,定义时需要指定行数和列数。
四、指针1.指针定义:指针是一个变量,用于存储另一个变量的地址。
定义指针时需要指定类型和名称,如int *p;2.指针运算:可以对指针进行加减运算,表示移动指针位置。
3.指针与数组:可以使用指针访问数组元素,如int *p = arr; p[0]表示arr[0]。
4.空指针:空指针是没有被初始化的指针。
五、结构体1.结构体定义:结构体是一种自定义数据类型,可以包含多个不同类型的成员变量。
C语言考试复习要点C语言是一种广泛应用于计算机编程领域的高级编程语言。
对于需要参加C语言考试的学生来说,了解重点复习的内容非常重要。
本文将讨论C语言考试的复习要点,帮助读者更好地准备考试。
一、基础概念与语法1. 数据类型:包括整型、浮点型、字符型等,了解它们的范围、存储空间和使用方法。
2. 变量与常量:掌握变量的声明、赋值和使用,了解常量的概念以及如何定义和使用。
3. 运算符:包括算术运算符、关系运算符、逻辑运算符等,了解它们的优先级和使用规则。
4. 控制语句:包括条件语句(if-else语句)、循环语句(for循环、while循环)和跳转语句(break语句、continue语句、return语句)等。
掌握它们的语法和用法,能够编写简单的流程控制程序。
二、数组与字符串1. 数组:了解数组的定义和使用,包括一维数组和多维数组,掌握数组的初始化、访问和遍历等操作。
2. 字符串:了解字符串的概念和字符数组的使用,能够实现字符串的输入、输出以及常见的字符串操作(比如拼接、复制、比较等)。
三、函数与指针1. 函数:了解函数的定义和使用,包括函数的声明、调用和返回值等。
掌握函数的参数传递方式(值传递、地址传递),能够编写简单的函数以及函数调用的程序。
2. 指针:理解指针的概念和作用,了解指针与数组、指针与函数的关系。
掌握指针的声明和使用,能够编写简单的指针操作程序。
四、文件操作1. 文件读写:了解文件的打开和关闭操作,能够进行文件的读取和写入。
掌握文件读写的基本函数(如fopen、fclose、fread、fwrite等)的使用。
2. 文件指针:了解文件指针的概念和作用,包括文件位置指针和错误指示指针。
能够使用文件指针进行文件的读写操作。
五、综合应用1. 综合编程:能够根据题目要求,运用C语言的基础知识和技巧,编写可以实现特定功能的程序。
2. 调试技巧:掌握常见的程序调试技巧,能够根据错误提示信息进行程序错误的定位和修复。
01.C程序根本构造一、C语言的特点:1、C语言源程序的根本组成单位是函数;一个C程序可由假设干个函数组成,其中必须有且仅有一个以main命名的主函数,其余的函数名称可由编程者自行设定。
,2、C程序的执行总是由main()函数的第一个可执行语句开场,到main〔〕函数的最后一个可执行的语句完毕;而其他函数都是在main〔〕函数开场执行以后,通过其他函数的调用才得以运行。
3、C语言系统提供了丰富的库函数,用户在程序中需要调用某个库函数时,必须用#include编译预处理命令将描述该库函数的头文件包含进去。
二、C程序的书写格式:1、语句可从分开放在任意多行内;如:printf(“To C,〞);printf(“ or not to C:〞);与printf(“To C , or not to C:〞);是等价的2、一行中可以有假设干个语句;如:a=123;b=345;3、每个语句和数据定义的最后必须有一个分号;三、C语言程序的运行:1、编译(pile):将C源程序文件翻译成能被计算机识别的二进制形式的“目标〞文件;编译时,编译器将检查源程序每一条语句的语法错误。
2、建造(Bulid):C语言程序例如:显示“Hello〞#include<stdio.h>int main(void){printf(“Hello.\n〞);return 0;}说明:#include<stdio.h> 是必不可少的,它包含了C语言标准输入输出库的相关信息;printf函数来自〞标准输入输出库〞,可以产生格式化输出;\n 告诉printf函数执行完信息显示后要进展换行操作;return 0 说明程序终止时会向操作系统返回值0;{ }来标出main〔〕函数的起始和完毕。
02.数据类型一、C语言的特点:1、C语言源程序的根本组成单位是函数;一个C程序可由假设干个函数组成,其中必须有且仅有一个以main命名的主函数,其余的函数名称可由编程者自行设定。
c语言的用法C语言是一种高级编程语言,被广泛应用于计算机科学和软件开发领域。
它具有简洁、灵活、高效的特点,成为了许多计算机专业学生的必修课程。
本文将介绍C语言的一些基本用法和常见应用。
一、C语言的基本语法C语言的语法规则比较严格,但也相对简单。
以下是C语言的基本语法要点:1. 注释:使用斜杠星号"/*...*/"可以注释多行,使用双斜杠"//"可以注释单行。
2. 数据类型:C语言提供了多种数据类型,包括整数、浮点数、字符和布尔类型等。
可以使用关键字来声明变量,如int、float、char和bool等。
3. 运算符:C语言支持各种算术运算符(如加减乘除)、逻辑运算符(如与或非)和比较运算符(如等于和不等于)等。
4. 控制语句:C语言中常用的控制语句有if语句、for循环、while 循环和switch语句等,用于控制程序的流程和执行次数。
5. 函数:C语言使用函数来模块化程序,函数可以包含输入参数和返回值,用于封装和重用代码。
二、C语言的基本用法1. 变量声明和赋值在C语言中,变量需要先声明后使用。
声明变量时需要指定变量名和数据类型,如:```cint num;float pi;char letter;```变量声明后可以进行赋值操作,如:```cnum = 10;pi = 3.14;letter = 'A';```也可以在声明的同时进行赋值,如:```cint num = 10;float pi = 3.14;char letter = 'A';```2. 输入和输出C语言提供了标准库函数来实现输入和输出操作。
常用的函数有:- printf:用于输出内容到终端;- scanf:用于从终端输入内容;示例代码:```cint num;printf("请输入一个整数:");scanf("%d", &num);printf("您输入的整数是:%d\n", num);```3. 条件语句C语言中的条件语句用于根据不同的条件执行不同的代码块。
C语言程序设计的五个关键要点C语言是一种广泛应用于系统开发和嵌入式编程的高级编程语言。
它是一种结构化的、静态类型的、过程性的编程语言,具有高效性和可移植性。
在学习和使用C语言时,了解并掌握以下五个关键要点将有助于编写高质量的程序和提高开发效率。
一、数据类型在C语言中,数据类型对于程序的正确性和性能至关重要。
C语言提供了基本数据类型,如整型(int)、字符型(char)、浮点型(float)等。
了解不同数据类型的特点和使用场景,能够避免常见的类型转换错误和内存溢出等问题。
另外,C语言还支持自定义数据类型,通过结构体(struct)和枚举(enum)可以更好地组织和管理复杂数据。
二、变量和表达式在C语言中,变量用于存储和操作数据。
合理使用变量需要考虑变量的命名规范,让程序易读且易于维护。
C语言支持各种运算符,如算术运算符、关系运算符、逻辑运算符等,通过灵活运用表达式可以实现各种复杂的计算和逻辑操作。
三、控制结构控制结构是编程中控制程序流程的关键。
C语言支持条件语句(如if语句、switch语句)和循环语句(如for循环、while循环),通过合理使用控制结构可以实现不同的逻辑和算法。
理解和熟练掌握控制结构可以提高程序的执行效率和可读性。
四、函数和模块化编程函数是C语言中的一个重要概念,通过函数可以将代码划分为独立的模块,提高代码的可重用性和可维护性。
在函数的设计和使用过程中,应该考虑函数的输入、输出和功能单一性原则。
模块化编程还可以通过头文件和源文件的分离来提高代码的组织结构和可维护性。
五、指针和内存管理指针是C语言的一项强大而复杂的特性,它提供了直接访问和操作内存空间的能力。
对于初学者来说,指针可能是C语言中最困难的部分,但理解指针的概念和掌握指针的使用是编写高效程序的关键。
指针可以用于动态内存分配和数据结构的实现,同时也需要注意指针的安全性和防止内存泄漏的问题。
在学习C语言程序设计时,深入理解并灵活应用以上五个关键要点,将帮助你编写出高质量、高效的程序。
《C和指针》《C专家编程》《C陷阱与缺陷》《C语言编程要点》《编程精粹--Microsoft编写优质无错C程序秘诀》总结说明:总结的知识点主要源于上面的4本书,《编程精粹--Microsoft编写优质无错C程序秘诀》这本书未做总结,该书有清晰版的pdf格式的电子版。
--wuliming--2007-04-25wuliming_sc@指针和数组相关概念*************************************************字符与字符串的区别指针与数组1指针与数组2指针和数组的相同与不同用malloc为字符串分配存储空间时的注意事项作为常数的数组声明(c缺陷与陷阱3.3节.在其它部分有包含该节的知识点,了解or略过) 字符串常量用字符串常量初始化指针和数组二维数组下标操作的相关概念指向一维、二维数组的指针array_name和&array_name的异同数组作为函数的参数时,不能通过sizeof运算符得到该数组的大小用strlen()求字符串的长度…char **‟ 和…const char **‟的兼容性问题空指针相关的问题NULL和NUL的区别未初始化的指针和NULL指针的区别理解函数的声明函数参数的传值调用函数指针作为函数参数的多维数组强制类型转换相关概念可变参数相关问题malloc()、calloc()、realloc()在程序退出main()函数之后,还有可能执行一部分代码吗?总线错误和段错误相关概念数字和字符串之间转换相关的函数*************************************************怎样判断一个字符是数字、字母或其它类别的符号?怎样将数字转换为字符串?怎样将字符串转换为数字?字符串以及内存操作相关函数*************************************************字符串拷贝和内存拷贝函数:strcpystrncpymemcpymemmovememccpybcopy字符串和内存数据比较函数:strcmpstrcasecmpstrncasecmpmemcmpstrcollbcmp连接字符串的函数:strcatstrncat查找字符/字符串的函数:strstrstrchrstrrchrmemchr其它相关的函数:indexrindexstrlenstrdupmemsetbzerostrspnstrcspnstrpbrkstrtok数据结构及算法相关函数qsort()bsearch()lsearch(线性搜索)lfind(线性搜索)srand(设置随机数种子)rand(产生随机数)OTHER************************************************* 什么是标准预定义宏?断言assert(表达式) 相关概念连接运算符“##”和字符串化运算符"#"有什么作用?注释掉一段代码的方法Typedef相关概念= 不同于==词法分析中的“贪心法”运算符的优先级问题变量的存储类型及初始化相关概念左值和右值相关的概念变量的值和类型相关的概念怎样删去字符串尾部的空格?怎样删去字符串头部的空格?怎样打印字符串的一部分?结构的自引用结构的存储分配边界计算与不对称边界整数溢出返回整数的getchar函数更新顺序文件随机数的相关概念用递归和迭代两种办法解fibonacci字符与字符串的区别(c缺陷与陷阱1.5节)#include <stdio.h>int main(){char ch = 'abcdefghijklmnopqrstuvwxyz';char str[] = "abcdefghijklmnopqrstuvwxyz";printf("-----%c-----\n%s\n",ch, str );return 0;}编译该程序可以通过,但是会产生警告;输出结过为:-----z-----Abcdefghijklmnopqrstuvwxyz // 在Dev-C++ 4.9.9.2编译环境中可以通过,但是在VC.0中通不过指针与数组1(c缺陷与陷阱3.1节)c语言中的数组值得注意的地方有以下两点:1、c语言中只有一维数组,而且数组的大小必须在编译期间就作为一个常数确定下来(C99标准允许变长数组,GCC编译器中实现了变长数组)。
然而,c语言中数组的元素可以是任何类型的对象,当然也可以是另外一个数组。
这样,要仿真出一个多维数组就不是一件难事。
2、对于一个数组,我们只能够做两件事:确定该数组的大小,以及获得指向该数组下标为0的元素的指针。
其他有关数组的操作,哪怕它们乍看上去是以数组下标进行运算的,实际上都是通过指针进行的。
换句话说,任何一个数组下标运算都等同于一个对应的指针运算,因此我们完全可以依据指针行为定义数组下标的行为。
现在考虑下面的例子:int i;int *p;int calendar[12][31];上面声明的calendar是一个数组,该数组拥有12个数组类型的元素,其中的每个元素都是一个拥有31个整型元素的数组。
因此,sizeof(calendar)的值是:31×12×sizeof(int)。
考虑一下,calendar[4]的含义是什么?因为calender是一个有着12个数组类型元素的数组,它的每个数组类型元素又是一个有着31个整型元素的数组,所以calendar[4]是calendar数组的第5个元素,是calendar 数组中12个有着31个整型元素的数组之一。
因此,calendar[4]的行为也表现为一个有着31个整型元素的数组的行为。
例如,sizeof(calendar[4])的结果是:31×sizeof(int)。
又如,p = calendar[4];这个语句使指针p指向了数组calendar[4]中下标为0的元素。
因为calendar[4]是一个数组,我们可以通过下标的形式来指定这个数组中的元素:i = calendar[4][7],这个语句也可以写成下面这样而表达的意思保持不变:i = *( calendar[4] + 7 ),还可以进一步写成:i = *( *( calendar + 4 ) + 7 )。
下面我们再看:p = calendar; 这个语句是非法的,因为calendar是一个二维数组,即“数组的数组”,在此处的上下文中使用calendar名称会将其转换为一个指向数组的指针。
而p是一个指向整型变量的指针,两个指针的类型不一样,所以是非法的。
显然,我们需要一种声明指向数组的指针的方法。
int calendar[12][31];int (*monthp)[31];monthp = calendar;int (*monthp)[31] 语句声明的*monthp 是一个拥有31个整型元素的数组,因此,monthp就是一个指向这样的数组的指针。
monthp指向数组calendar的第一个元素。
HERE指针与数组2(c和指针.P141.)·1、数组的名的值是一个指针常量,不能试图将一个地址赋值给数组名;·2、当数组名作为sizeof操作符的操作数时,sizeof(arrayname)返回的是整个数组的长度,而不是指向数组的指针的长度;·3、当数组名作为单目操作符&的操作数,取一个数组名的地址所产生的是一个指向数组的指针,而不是一个指向某个指针常量值的指针。
·4、指针和数组并不总是相等的。
为了说明这个概念,请考虑下面这两个声明:int a[5];int *b;a和b能够互换吗?它们都具有指针值,它们都可以进行间接访问和下标操作。
但是,它们还是有很大的区别的:声明一个数组时,编译器将根据声明所指定的元素数量为数组保留内存空间,然后再创建数组名,它的值是一个常量,指向这段空间的起始位置。
声明一个指针变量时,编译器只为指针本身保留内存空间,它并不为任何整型值分配内存空间。
而且,指针变量并未被初始化为指向任何现有的内存空间,如果它是一个自动变量,它甚至根本不会被初始化。
把这两个声明用图的方法表示,可以发现它们之间存在显著的不同:*a是完全合法的,但表达式*b却是非法的。
*b将访问内存中某个不确定的位置,或者导致程序终止。
另一方面,表达式b++可以通过编译,但是a++却不能,因为a的值是一个常量。
#include<stdio.h>int main(){//注意sizeof(num)的长度应该为10*4=40int num[] = {0,1,2,3,4,5,6,7,8,9};printf(" sizeof(num) = %d\n", sizeof(num) );//注意sizeof(str)的长度应该为11,包括字符串后面的'\0'char str[] = "0123456789";printf(" sizeof(str) = %d\n", sizeof(str) );//注意sizeof(str1)的长度应该为10,不包括字符串后面的'\0',但是,最好将字符串的最后一个字符设定为空char str1[] = {'0','1','2','3','4','5','6','7','8','9'};printf(" sizeof(str1) = %d\n", sizeof(str1) );//&num的类型为'int (*)[10]',表示的是一个指向长度为10的整形数组的指针int (*ptoint)[10] = #printf(" sizeof(ptoint) = %d, (*ptoint)[9] = %d\n", sizeof(ptoint), (*ptoint)[9] );//&str的类型为'char (*)[11]',表示的是一个指向长度为11的字符数组的指针,注意str数组的长度是11,而不是10 char (*ptostr)[11] = &str;printf(" sizeof(ptostr) = %d, (*ptostr)[9] = %c\n", sizeof(ptostr), (*ptostr)[9] );//由于p指向的是数组num[5],所以对下标取负值后,不会超出数组的正常取值范围//该例子也说明了为什么下标检查在c语言中是一项困难的任务:下标引用可以作用于任意的指针,而不仅仅是数组名//作用于指针的下标引用的有效性即依赖于该指针当时恰好指向什么内容,也依赖于下标的值int *p = num + 5;printf(" p[-1] = %d, p[0] = %d, p[1] = %d \n", p[-1],p[0],p[1] );//下面的表达式中,'num[5]和5[num]'的值是一样的,把它们转换成对等的间接访问表达式,它们都等同于*(num + 2) //'5[num]'这个古怪的表达式之所以可行,缘于C实现下标的方法。