C语言家教记录(六)

导语

本次授课的内容如下:指针,指针和数组

辅助教材为 《C语言程序设计现代方法(第2版)》

指针

指针变量

计算机按字节划分地址,每个地址访问一个字节

指针变量指向变量的地址,指的是变量第一个字节的地址

c 复制代码
int *p;
int i,j,a[10],*p,*q;
int *x;
double *y;
char *z;
sizeof(x);

相关运算符

取地址符&

c 复制代码
int x;
int *p;
p=&x;//指针变量存储了地址
scanf("%d",&x);
scanf("%d",p);//等价

int i,*p=&i;

间接寻址符*

c 复制代码
int x,*p=x;//p是x的别名
x=10;
printf("%d\n",*p);
int y=*&x;
*p=3;
printf("%d %d\n",x,y);

赋值

浅复制:指针指向的是同一个数据

具体讲解书上例子

c 复制代码
int i,j,*p,*q;
p=&i;
q=p;
*q=*p;

作参

可以完成对输入参数的修改

c 复制代码
#inlcude <stdio.h>
#include <stdlib.h>
void decompose(double x, long *int_part, double *frac_part)//传入的是地址
{
 *int_part = (long) x;
 *fract_part = x - *int_part;
}
int main()
{
	int i;
	double d;
	decompose(3.14159, &i, &d);
	printf("%d %f",i,d);
}

示例程序

c 复制代码
#include <stdio.h>
#define N 10
void max_min(int a[], int n, int *max, int *min);
int main(void)
{
 int b[N], i, big, small;
 printf("Enter %d numbers: ", N);
 for (i = 0; i < N; i++)
 scanf("%d", &b[i]);
 max_min(b, N, &big, &small);
 printf("Largest: %d\n", big);
 printf("Smallest: %d\n", small);
 return 0;
}
void max_min(int a[], int n, int *max, int *min)
{
 int i;
 *max = *min = a[0];
 for (i = 1; i < n; i++) {
 if (a[i] > *max)
 *max = a[i];
 else if (a[i] < *min)
 *min = a[i];
 }
}

作返回

示例程序

c 复制代码
int *max(int *a, int *b)
{
 if (*a > *b)
 return a;
 else
 return b;
}
int *p,i,j;
p=max(&i,&j);
//不能返回局部变量的指针
int*find_middle(int a[], int n) {
 return &a[n/2];
}

指针和数组

指针算术运算

c 复制代码
int*p,a[10];
for(int i=0;i<10;i++)a[i]=i;
p=a;//p指向第一个元素
p++;//p指向第二个元素
p+=5;
p--;
p-=2;
int *q=a;
printf("%d %d",q-p,p-q);

p>q?p:q;//指针相互比较为同一数组中的位置

处理数组

指针可以代替变量i

c 复制代码
int a[N], sum, *p;
sum = 0;
//p<a+N也可以
for (p = &a[0]; p < =&a[N-1]; p++)
 sum += *p;

数组名做指针

数组名是定值,不能用来操作

c 复制代码
for (p = a; p < a + N; p++)
 sum += *p;

数组作为函数参数时,直接复制整个数组,但是如果传入数组名,就只会复制数组的首地址

c 复制代码
int find_largest(int a[], int n)
{
 int i, max;
 max = a[0];
 for (i = 0; i < n; i++)
 if (a[i] > max)
 max = a[i];
 return max;
}
int find_largest(int* a, int n)
{
 int i, max;
 max = a[0];
 for (i = 0; i < n; i++)
 if (a[i] > max)
 max = a[i];
 return max;
}

示例程序

c 复制代码
#include <stdio.h>
#define N 10
int main(void)
{
 int a[N], *p;
 printf("Enter %d numbers: ", N);
 for (p = a; p < a + N; p++)
 scanf("%d", p);
 printf("In reverse order:");
 for (p = a + N - 1; p >= a; p--)
 printf(" %d", *p);
 printf("\n");
 return 0;
}

指针和多维数组

指针可以使得双循环变单循环

c 复制代码
for (row = 0; row < NUM_ROWS; row++)
 for (col = 0; col < NUM_COLS; col++)
 a[row][col] = 0;
 for (p = &a[0][0]; p <= &a[NUM_ROWS-1][NUM_COLS-1]; p++)
 *p = 0;

如果只是处理一行

c 复制代码
for (p = a[i]; p < a[i] + NUM_COLS; p++)
 *p = 0;

处理一列

c 复制代码
for (p = &a[0]; p < &a[NUM_ROWS]; p++)
 (*p)[i] = 0;

数组是数组名永远会被编译器认为是一维的,而不是二维,是指向a[0]而不是a[0][0]

总结和复习

本次授课讲述第11章和第12章内容,关键点:指针

相关推荐
KeyPan6 分钟前
【视觉惯性SLAM:十一、ORB-SLAM2:跟踪线程】
人工智能·数码相机·算法·机器学习·计算机视觉
XiaoLeisj18 分钟前
【递归,搜索与回溯算法 & 记忆化搜索】深入理解记忆化搜索算法:记忆化搜索算法小专题
算法·leetcode·决策树·深度优先·动态规划·剪枝
励志成为大佬的小杨25 分钟前
c语言中的枚举类型
java·c语言·前端
程序员老冯头30 分钟前
第二十三章 C++ 继承
开发语言·数据结构·c++·算法·继承
意疏38 分钟前
【机器学习篇】从新手探寻到算法初窥:数据智慧的开启之门
人工智能·算法·机器学习
Dream it possible!1 小时前
LeetCode 热题 100_二叉树的最大深度(37_104_简单_C++)(二叉树;递归;层次遍历)
c++·算法·leetcode
叫我阿呆就好了1 小时前
C 进阶 — 文件操作
c语言·开发语言
阳光开朗大男孩 = ̄ω ̄=1 小时前
指针之矢:C 语言内存幽境的精准飞梭
c语言
Channing Lewis1 小时前
服务器广播算法
运维·服务器·算法
Michael_Good1 小时前
【C/C++】C语言编程规范
c语言·开发语言·c++