cad培训班一般学费多少钱,seo查询站长,网上购物平台类型,宝应县城乡建设局网站1.指针变量与普通变量
指针变量与普通变量是C语言中的两种不同类型的变量#xff0c;它们有一些重要的区别和联系。 普通变量是一种存储数据的容器#xff0c;可以直接存储和访问数据的值。#xff1a;
int num 10; // 定义一个整数型普通变量num#xff0c;赋值为10在例…
1.指针变量与普通变量
指针变量与普通变量是C语言中的两种不同类型的变量它们有一些重要的区别和联系。 普通变量是一种存储数据的容器可以直接存储和访问数据的值。
int num 10; // 定义一个整数型普通变量num赋值为10在例子中变量num是一个普通整数变量它直接存储了值10。 指针变量是一种特殊类型的变量它存储的是内存地址即某个数据在计算机内存中的位置。指针变量本身不直接存储数据的值而是存储数据的地址通过这个地址可以访问实际存储在该地址上的数据。
int *ptr; // 定义一个整数型指针变量ptr
int num 10; // 定义一个整数型普通变量num赋值为10
ptr num; // 将ptr指向num的地址在例子中ptr是一个整数型指针变量它存储了变量num的地址。通过ptr可以访问和修改num的值
*ptr 20; // 通过ptr修改了num的值将其改为20这里的*ptr表示通过指针ptr访问所指向的内存地址上的数据。
例 1输入两个整数按先大后小的顺序输出这两个数。请用指针来编程
用指针的编写方法
#includestdio.h int main() {int a, b, *p, *q, t;printf(请输入两个整数:\n);scanf(%d,%d, a, b); // 输入两个整数p a; // p指向a的地址q b; // q指向b的地址if (a b) {t *p; // 将p指向的值赋值给t*p *q; // 将q指向的值赋值给p实现交换*q t; // 将t的值赋值给q}printf(较大数为%d 较小数为%d\n, a, b); // 输出交换后的结果return 0;
}运行结果
简单总结
普通变量直接存储数据的值。指针变量存储数据的地址通过地址可以访问实际数据。指针变量通常需要初始化指向某个有效的内存地址。指针变量使用*操作符来访问所指向的数据。
2.指针变量与一维数组
指针变量与一维数组有着密切的关系因为数组名本身就是一个指针。以下是一些关于指针变量与一维数组的重要概念和用法
指针与数组名数组名是指向数组第一个元素的指针。例如如果有一个整型数组 arr则 arr 等价于 arr[0]都表示数组第一个元素的地址。指针遍历数组可以使用指针遍历数组的元素。通过递增指针的值可以访问数组的不同元素。指针作为函数参数可以将数组的首地址传递给函数从而在函数内部操作整个数组。
例 1一个整型数组里的 5 个元素由键盘输入将每个元素变为原来的两倍后再依次输出。 之前的编写方法
#include stdio.hint main() {int a[5];int i;printf(请输入 5 个整数:\n);for (i 0; i 5; i) {scanf(%d, a[i]);a[i] a[i] * 2; // 在这里将每个元素加倍}printf(加倍后的各整数为:\n);for (i 0; i 5; i) {printf(%d\t, a[i]);}printf(\n);return 0;
}运行结果
用指针的编写方法
#include stdio.hint main() {int a[5];int i, *p;p a[0];printf(请输入 5 个整数:\n);for (i 0; i 5; i) {scanf(%d, p i);*(p i) *(p i) * 2; // 在这里将每个元素加倍}printf(加倍后的各整数为:\n);for (i 0; i 5; i) {printf(%d\t, *(p i));}printf(\n);return 0;
}运行结果
简单总结 数组名[某数] 相当于 数组名某数 数组名[某数] 相当于 *(数组名某数)
3.指针变量与一维数组相关函数
指针与数组名的关系 在C语言中数组名本身就是一个指针它指向数组的第一个元素的地址。例如如果有一个整数数组 int arr[5]那么 arr 就是指向 arr[0] 的指针。指针遍历数组 通过使用指针我们可以遍历整个数组。例如可以使用指针 int *ptr 来访问数组的元素其中 ptr 初始化为数组的首地址然后逐渐递增以访问数组的不同元素。指针与数组的传递 函数可以接受指向数组的指针作为参数这样可以避免将整个数组复制到函数中。这对于处理大型数组非常有用因为它减少了内存和时间开销。例如函数原型可以是 void myFunction(int *arr, int size)其中 arr 是指向数组的指针size 是数组的大小。数组作为函数返回值 函数可以返回指向数组的指针。这在某些情况下很有用例如在函数内部动态分配数组内存然后返回指向该数组的指针。使用指针函数修改数组 指针函数可以用来修改传递给它们的数组的内容而无需返回任何值。这使得函数能够在调用函数中直接修改数组的元素。字符串和字符数组 字符串在C语言中是字符数组它们以空字符 \0 结尾。通过使用指向字符的指针我们可以对字符串进行各种操作如拷贝、连接、比较等。
例 1有两个小组分别有 5 名学生和 10 名学生。请编程输入这些学生的成绩并调用一个 aver 函数求这两个小组的平均分。 形参是数组名实参是数组名
#include stdio.hfloat aver(float a[], int n);int main()
{float zu1[5], zu2[10];int i;printf(请输入第 1 组的学生成绩:\n);for (i 0; i 4; i){scanf(%f, zu1[i]);}printf(请输入第 2 组的学生成绩:\n);for (i 0; i 9; i){scanf(%f, zu2[i]);}printf(第 1 组平均分是%.2f\n, aver(zu1, 5));printf(第 2 组平均分是%.2f\n, aver(zu2, 10));return 0;
}float aver(float a[], int n)
{float sum a[0], pingjunshu;int i;for (i 1; i n; i){sum sum a[i];}pingjunshu sum / n;return (pingjunshu);
}运行结果
形参是指针变量实参是数组名
#include stdio.hfloat aver(float *p, int n);int main()
{float zu1[5], zu2[10];int i;printf(请输入第 1 组的学生成绩:\n);for (i 0; i 5; i){scanf(%f, zu1[i]);}printf(请输入第 2 组的学生成绩:\n);for (i 0; i 10; i){scanf(%f, zu2[i]);}printf(第 1 组平均分是%.2f\n, aver(zu1, 5));printf(第 2 组平均分是%.2f\n, aver(zu2, 10));return 0;
}float aver(float *p, int n)
{float sum *p, pingjunshu;int i;for (i 1; i n; i){sum sum *(p i);}pingjunshu sum / n;return (pingjunshu);
}运行结果
形参是指针变量实参是指针变量
#include stdio.hfloat aver(float *p, int n);int main()
{float zu1[5], zu2[10];int i;printf(请输入第 1 组的学生成绩:\n);for (i 0; i 5; i){scanf(%f, zu1[i]);}printf(请输入第 2 组的学生成绩:\n);for (i 0; i 10; i){scanf(%f, zu2[i]);}printf(第 1 组平均分是%.2f\n, aver(zu1, 5));printf(第 2 组平均分是%.2f\n, aver(zu2, 10));return 0;
}float aver(float *p, int n)
{float sum *p, pingjunshu;int i;for (i 1; i n; i){sum sum *(p i);}pingjunshu sum / n;return (pingjunshu);
}运行结果
4.指针变量与二维数组
二维数组的内存结构 二维数组在内存中是连续存储的一块区域其元素按行优先的顺序排列。这意味着二维数组的每一行都存储在连续的内存块中而指向下一行的指针则指向下一个连续内存块的起始地址。指针与二维数组的关系 二维数组名本身是一个指向数组的指针。例如如果有一个二维整数数组 int arr[3][4]那么 arr 就是一个指向整数数组的指针它指向数组的第一行。使用指针访问二维数组元素 可以使用指向二维数组的指针来访问数组元素。例如可以使用 int (*ptr)[4] 来声明一个指向 arr 的指针然后通过 ptr 来访问数组的不同元素其中 4 表示每行的元素个数。二维数组作为函数参数 函数可以接受指向二维数组的指针作为参数。这对于处理二维数组非常有用因为它可以减少数据复制的开销。例如函数原型可以是 void myFunction(int (*arr)[4], int rows, int cols)其中 arr 是指向二维数组的指针rows 和 cols 分别表示数组的行数和列数。指针与多维数组的关系 指针与多维数组的关系不仅限于二维数组还可以用于更高维度的数组。例如可以声明一个指向三维数组的指针以便访问三维数组的元素。使用指针遍历二维数组 可以使用指针来遍历整个二维数组通过逐行或逐列访问元素。这种方法在处理二维数据集时非常有用。
例 1已知整型二维数组 a[3][4]{1,2,3,4,5,6,6,5,4,3,2,1}。 请用指针变量输出二维数组各元素的值。
#include stdio.hint main() {int a[3][4] {{1, 2, 3, 4}, {5, 6, 6, 5}, {4, 3, 2, 1}};int *p;for (p a[0]; p a[0] 11; p) {if ((p - a[0]) % 4 0) {printf(\n);}printf(%d\t, *p);}printf(\n);return 0;
}运行结果
简单总结 数组名[数 α][数 β] 相当于 数组名[数 α]数 β 也相当于 数组名[0]α*列数β 数组名[数 α][数 β] 相当于 *(数组名[数 α]数 β)
5.指针变量与二维数组相关函数
1.指针变量与二维数组的关系 在C语言中一个二维数组的名称实际上是指向数组的指针。例如对于 int arr[3][4] 这个二维数组arr 是一个指向整数数组的指针它指向数组的第一行。这一点使得指针变量能够与二维数组紧密合作。 2.传递二维数组给函数 函数可以接受指向二维数组的指针作为参数。这样可以避免复制整个数组提高了程序的效率。例如可以使用以下函数原型来接受一个二维整数数组
void processArray(int (*arr)[4], int rows, int cols);这里arr 是一个指向 int[4] 数组的指针rows 和 cols 分别表示数组的行数和列数。 3. 函数内使用指针处理二维数组 在函数内部可以使用指针来处理传递进来的二维数组。通过指针可以访问和修改数组元素进行各种操作。 4. 指向二维数组的指针变量 可以声明指向二维数组的指针变量以便遍历整个二维数组。例如int (*ptr)[4] 表示一个指向包含4个整数的数组的指针可以用它来访问数组元素。 5. 多维数组的通用性 这种技术不仅适用于二维数组还可以扩展到更高维度的数组。可以声明指向多维数组的指针以便处理多维数据结构。 6. 优化内存使用 使用指针和相关函数可以减少内存使用特别是在处理大型数据集时。这有助于提高程序的性能和效率。
例 1有 3 名学生学习 4 门课学生一的成绩分别是 65、67、70、60学生二的分别是 80、87、90、81学生三的分别是 90、99、93、98。将上述成绩输入二维数组并通过函数输出三人的总平均分。
形参是指针变量实参是数组名
#include stdio.hvoid shuchu(float *p, int n);int main() {float fenshu[3][4] {{65, 67, 70, 60}, {80, 87, 90, 81}, {90, 99, 93, 98}};// 传递二维数组的地址shuchu(*fenshu, 12);return 0;
}void shuchu(float *p, int n) {float sum 0;int i;for (i 0; i n; i) {sum *(p i);}printf(三人的总平均分为%f\n, sum / n);
}运行结果
形参是指针变量实参是指针变量
#include stdio.hvoid shuchu(float *p, int n);int main() {float fenshu[3][4] {{65, 67, 70, 60}, {80, 87, 90, 81}, {90, 99, 93, 98}};int *q;q fenshu[0][0];shuchu(q, 12);return 0;
}void shuchu(float *p, int n) {float sum 0;int i;for (i 0; i n; i) {sum *(p i);}printf(三人的总平均分为%f\n, sum / n);
}运行结果
6.指针变量指向二维数组的行变量
例 1请用指针变量指向二维数组的行变量的方法将 中某行某列的值输出来。
#include stdio.hint main() {int a[3][3] {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}};int (*p)[3]; // 声明指向具有3个整数的数组的指针p a;int i, j, hang, lie;printf(请输入行数与列数:\n);scanf(%d,%d, hang, lie); // 修正此处i hang - 1;j lie - 1;printf(%d行%d列的元素为%d\n, hang, lie, *(*(p i) j));return 0;
}运行结果
7.用指向二维数组行变量的指针变量做形参
例 1有 3 名学生学习 4 门课学生一的成绩分别是 65、67、70、60学生二的分别是 80、87、90、81学生三的分别是 90、99、93、98。将上述成绩存入二维数组并通过函数输出第 2 个学生的各科成绩。
#include stdio.hvoid shuchu(float (*p)[4], int n);int main() {float fenshu[3][4] {{65, 67, 70, 60}, {80, 87, 90, 81}, {90, 99, 93, 98}};shuchu(fenshu, 2);return 0;
}void shuchu(float (*p)[4], int n) {int i;printf(第%d个学生的各科成绩是:\n, n);for (i 0; i 3; i)printf(%f\t, *(*(p n - 1) i));printf(\n);
}
运行结果
8.指针变量与字符串
字符串表示字符串是字符数组的一种形式以空字符 ‘\0’ 结尾。例如“Hello” 在内存中表示为字符数组 {‘H’, ‘e’, ‘l’, ‘l’, ‘o’, ‘\0’}。 字符指针指针变量可以用来指向字符串的首字符。例如char str “Hello”; 将 str 指向字符串 “Hello” 的首字符 ‘H’。 字符串输入使用 scanf 或 fgets 等函数可以从用户输入或文件中读取字符串并将其存储在字符数组中。 字符串输出使用 printf 函数可以将字符串打印到标准输出或文件。 字符串处理指针变量可以用来遍历和操作字符串中的字符。你可以使用指针来查找字符串中的特定字符拷贝字符串连接字符串比较字符串等。
以前的编写方法
#includestdio.hint main() {int i;char a[] {I, , a, m, , m, u, c, h, e, n, !, !};char b[10086];for (i 0; a[i] ! \0; i) {b[i] a[i];}b[i] \0; // 添加终止字符printf(字符串 b 是:\n);for (i 0; b[i] ! \0; i) {printf(%c, b[i]);}printf(\n);return 0;
}运行结果
指向字符串的指针写法
#include stdio.hint main() {int i;char a[] {I, , a, m, , m, u, c, h, e, n, !, !};char b[10086];char *p, *q;p a[0];q b[0];for (i 0; *(p i) ! \0; i)*(q i) *(p i);*(q i) \0;printf(字符串 b 是:\n);for (i 0; *(q i) ! \0; i)printf(%c, *(q i));printf(\n);return 0;
}运行结果
简单总结 数组名[某数] 相当于 数组名某数 数组名[某数] 相当于 *(数组名某数)
9.指针变量与字符串相关函数
例 1定义字符串 a 为“I am muchen!”将其复制到字符串 b 里 并输出字符串 b。请调用函数编写此程序。 以前的编写方法(形参是数组名实参是数组名)
#include stdio.hvoid fuzhi(char yuanlaide[], char xinde[]); // 声明函数int main() {int i;char a[] {I, , a, m, , m, u, c, h, e, n, !, !};char b[10086];printf(字符串 b 是:\n);// 调用函数来复制字符串fuzhi(a, b);for (i 0; b[i] ! \0; i)printf(%c, b[i]);printf(\n);return 0;
}// 定义函数来复制字符串
void fuzhi(char yuanlaide[], char xinde[]) {int i;for (i 0; yuanlaide[i] ! \0; i) xinde[i] yuanlaide[i];xinde[i] \0; // 添加字符串结束符
}
运行结果
形参是指针变量实参是数组名
#include stdio.hvoid fuzhi(char *yuanlaidep, char *xindep); // 声明函数int main() {int i; // 声明变量 ichar a[] {I, , a, m, , m, u, c, h, e, n, !, !};char b[10086];printf(字符串 b 是:\n);// 调用函数来复制字符串fuzhi(a, b);for (i 0; b[i] ! \0; i)printf(%c, b[i]);printf(\n);return 0;
}// 定义函数来复制字符串
void fuzhi(char *yuanlaidep, char *xindep) {int i;for (i 0; *(yuanlaidep i) ! \0; i)*(xindep i) *(yuanlaidep i);*(xindep i) \0; // 添加字符串结束符
}运行结果
10.指针变量与函数
例 1输入两个整数用 max 函数求二者中的较大数并输出。 以前的编写方法
#include stdio.hint max(int x, int y);int main() {int a, b;printf(请输入两个整数:\n);scanf(%d,%d, a, b);printf(较大数为%d\n, max(a, b));return 0;
}int max(int x, int y) {return (x y ? x : y);
}运行结果
改成用指针指向函数
#include stdio.hint max(int x, int y);int main() {int a, b, maxValue;int (*p)(int, int);p max;printf(请输入两个整数:\n);scanf(%d,%d, a, b);maxValue p(a, b); // 直接调用函数指针printf(较大数为%d\n, maxValue);return 0;
}int max(int x, int y) {return (x y ? x : y);
}运行结果
例 2输入两个整数然后让用户选择 1 或 2 选 1 时调用 max函数输出二者中的较大数选 2 时调用 min 函数输出二者中的较小数。
宿舍要断电了这个代码先存着后续补11.返回指针值的函数
例 1有 3 名学生学习 4 门课学生一的成绩分别是 65、67、70、60学生二的分别是 80、87、90、81学生三的分别是 90、99、93、98。用指针函数来变成要求在用户输入学生序号以后能输出该学生的各科成绩。
#include stdio.hfloat *find(float (*row)[4], int n);int main() {float scores[3][4] {{65, 67, 70, 60}, {80, 87, 90, 81}, {90, 99, 93, 98}};float *ptr;int studentNumber, i;printf(Enter the student number: );scanf(%d, studentNumber);printf(Grades for student %d:\n, studentNumber);ptr find(scores, studentNumber - 1);for (i 0; i 3; i) {printf(%.2f\t, *(ptr i));}printf(\n);return 0;
}float *find(float (*row)[4], int n) {float *result;result *(row n);return result;
}运行结果
12.指针与一维二维数组的数值关系