导图社区 C语言的重难点:数组-指针-函数
本思维导图源自省级教坛新秀的省级示范课内容。首次明确了数组首地址和数组地址的定义,并详细比较其内涵和用法。从全新的角度阐述了数组、指针、函数的数据类型和内在关系。把C语言的最难点史无前例的用2个图清晰的展示出来。指针因为本图而不难!
编辑于2021-12-29 21:38:22联网双创大赛项目基本思路思维导图。导图包括学生打游戏给社会带来极大负担、我们发现无法有效控制的原因是存在n个问题没有解决、该产品的应用推广情况、我们为保护该产品做了哪些工作、公司进展和规划、公司能为社会带来哪些效益等内容。
网上一大堆的C语言导图,但都是知识点的罗列,尤其是数组和指针的内在关系,都没有说清楚。本导图首次阐述了数组首地址、数组地址的区别,及其和指针的内在逻辑。这是最好的C语言程序设计思维导图,既适合新手入门,也适合高手作为资料查询。
本思维导图源自省级教坛新秀的省级示范课内容。首次明确了数组首地址和数组地址的定义,并详细比较其内涵和用法。从全新的角度阐述了数组、指针、函数的数据类型和内在关系。把C语言的最难点史无前例的用2个图清晰的展示出来。指针因为本图而不难!
社区模板帮助中心,点此进入>>
联网双创大赛项目基本思路思维导图。导图包括学生打游戏给社会带来极大负担、我们发现无法有效控制的原因是存在n个问题没有解决、该产品的应用推广情况、我们为保护该产品做了哪些工作、公司进展和规划、公司能为社会带来哪些效益等内容。
网上一大堆的C语言导图,但都是知识点的罗列,尤其是数组和指针的内在关系,都没有说清楚。本导图首次阐述了数组首地址、数组地址的区别,及其和指针的内在逻辑。这是最好的C语言程序设计思维导图,既适合新手入门,也适合高手作为资料查询。
本思维导图源自省级教坛新秀的省级示范课内容。首次明确了数组首地址和数组地址的定义,并详细比较其内涵和用法。从全新的角度阐述了数组、指针、函数的数据类型和内在关系。把C语言的最难点史无前例的用2个图清晰的展示出来。指针因为本图而不难!
数组与指针
预备知识
变量的指针/地址
变量名前加 &
例:
1||| int var = 0; 变量var的地址或指针为:&var
2||| int a1d[10] = {0}; 数组a1d的地址为:&a1d
获得地址/指针中的数据
地址/指针前加 *
例
int var = 123; int *p = &var; int tmp = *p; 获得指针p中的内容123,赋值给tmp
规定:数据类型相同(兼容)的变量才允许相互赋值
变量
dataType variableName [= initializedValue];
1||| int var = 0;
2||| char c = 'a';
数组
由一组数据类型相同的变量或数组构成的集合。
1||| 数值数组:int num_array[10] = {0};
2||| 字符数组:char char_array[10] = {'a'};
3||| 二维数组:int a2d[3][4] = {{0}};
4||| 指针数组:int *p[4] = {a2d[0],a2d[1],a2d[2],a1d};
5||| ......
一维数组 int a1d[10] = {0};
由一组数据类型相同的变量构成的集合
数组元素:a1d[id]
a1d[id] 用法与 var 完全相同
数组名:a1d
数组首元素的地址,简称首地址。
类型:int *
数组地址
&a1d
类型:int (*)[]
注:数组首地址 ¹ 数组地址。
二维数组 int a2d[3][4] = {{0}};
由一组数据类型相同的一维数组构成的集合
数组元素:a2d[id1][id2]
a2d[id1][id2]用法与 var 完全相同
由一维数组构成
a2d[0]、a2d[1]、a2d[2]的用法与a1d完全一致
数组名:a2d
数组首元素的地址
类型:int (*)[]
二维数组的首元素是一维数组,一维数组地址类型(*)[]
例:int (*p)[10] = a2d;
数组地址
&a2d
类型:int (*)[][]
指针数组 int *p[4] = {a2d[0],a2d[1],a2d[2],a1d};
由一组指针变量构成的集合
数组元素p[0],p[1],p[2],p[3],其用法和 &var 完全相同
数组名:p
数组首元素的地址
类型:int **
首元素的内容为指针,所以是指针的指针,即双重指针
例:int **p2 = p;
数组地址
&p
类型:int *(*)[];
int *(*p3)[4]=&p;
例:
本文件为C++源文件,不是C语言源文件。 因为C语言没有输出变量类型的方法,此处借用了C++的方法。
#include <stdio.h> #include <typeinfo.h> int main() { int var = 0; int a1d[10] = {1,2,3,4,5,6,7,8,9,0}; int *p_var = &var; int (*p_a1d)[10]= &a1d; printf("\n"); printf("\t&var:\t\t%s\n",typeid(&var).name()); printf("\t&a1d[0]:\t%s\n",typeid(&a1d[0]).name()); printf("\ta1d:\t\t%s\n",typeid(a1d).name()); printf("\t&a1d:\t\t%s\n",typeid(&a1d).name()); printf("\n"); int a2d[3][10] = {{0}}; int (*p1_a2d)[10] = a2d; int (*p_a2d)[3][10] = &a2d; printf("\ta2d:\t\t%s\n",typeid(a2d).name()); printf("\t&a2d[0][0]:\t%s\n",typeid(&a2d[0][0]).name()); printf("\ta2d[0]:\t\t%s\n",typeid(a2d[0]).name()); printf("\t&a2d[0]:\t%s\n",typeid(&a2d[0]).name()); printf("\t&a2d:\t\t%s\n",typeid(&a2d).name()); printf("\n"); int *p[4] = {a2d[0],a2d[1],a2d[2],a1d}; int **p2 = p; int *(*p3)[4]=&p; printf("\tp:\t\t%s\n",typeid(p).name()); printf("\tp[0]:\t\t%s\n",typeid(p[0]).name()); printf("\t&p[0]:\t\t%s\n",typeid(&p[0]).name()); printf("\tp2:\t\t%s\n",typeid(p2).name()); printf("\t&p:\t\t%s\n",typeid(&p).name()); printf("\n"); return 0; }
&var: Pi &a1d[0]: Pi ald: A10_i &ald: PA10_i a2d: A3_A10_i &a2d[0][0]: Pi a2d[0]: A10_i &a2d[0]: PA10_i &a2d: PA3_A10_i p: A4_Pi p[0]: Pi &p[0]: PPi p2: PPi &p: PA4_Pi
i:int P:指针 数字:元素个数 A:数组 规则:后面修饰前面的 例如:PA10_i:包含10个整型元素的数组指针。
数组-函数-指针
函数 Type Name(Arguments_List)
声明
int add(int a, int b);
位置
main函数前面
头文件
定义
int add(int a, int b) { return (a + b); }
调用
int sum = 0; sum = add(3,2);
声明、定义、调用三者要一致
参数传递
实际参数传递给形式参数
单向
值传递
实参、形参的类型要一致
按位置传
返回值
函数类型、返回值类型、调用时的类型要一致
例题
1||| #include <stdio.h> int add(int a, int b); // 函数声明 int main() { int sum = 0; sum = add(3,2); // 函数调用 return 0; } int add(int a, int b) // 函数定义 { return (a + b); }
2|||
#include <stdio.h> int test(int [], int x2[], int *, int *x4,int (*x5)[5]); int main() { int a[5] = {1,2,3,4,5}; int tmp = 0; tmp = test(a,&a[0],a,&a[0],&a); printf("%d\n",tmp); return 0; } int test(int x1[], int x2[], int *x3, int *x4,int (*x5)[5]) { int temp = 0; temp = x1[0] + x2[0] + *x3 + *x4 + (*x5)[0]; return (temp); }