一.指针初阶
1.指针类型决定了:指针解引用的权限有多大。
char 型改变两个字节,int改变8个字节。
2.指针类型决定了指针走一步走多远。
int加4,char加1,double加8
3.
4.野指针产生
1)局部指针变量不初始化将是一个随机值
2)越界访问
3)指针指向空间释放
函数test中的a的地址在return之后地址就被释放了,所以main函数调用的时候就是非法访问。
5.如何避免野指针
当你不清楚指针收否是空指针时,使用if语句
6.指针的运算
1)指针加减整数
将数组的各元素赋值为0。
2)指针-指针
指针-指针得到的是两个指针之间的元素个数,相减的前提是两个指针指向同一块空间。
利用指针-指针来表示strlen函数。
3)指针的关系运算
7.指针和数组
数组本质
8.二级指针变量
二级指针变量是用来存放一级指针变量地址的
9.指针数组
存放指针的数组就是指针数组
用指针数组代替二维数组
二.指针练习题
题目链接(10条消息) C语言-指针练习(附答案)_c语言函数指针练习题_a婵a的博客-CSDN博客
1.求最大最小值
#include <stdio.h>int main(){int a[10] = {0};int* max = NULL;int* min =NULL;int i,j;for (j = 0; j< 10; j++){scanf_s("%d", &a[j]);}max = min = &a[0];for (i = 1; i < 10; i++) {if (*(a + i) > *max) {max = a + i;}else if (*(a + i) < *min) {min = a + i;}}printf("%d %d",*max,*min);return 0;}
2.输入10个整数,将其中最小的数与第一个数对换,把最大的数与最后一个数对换。最后输出这10个整数。
#include <stdio.h>int main(){int a[10] = {0};int* max = NULL;int* min=NULL;int i,j,k,t;for (j = 0; j< 10; j++){scanf_s("%d", &a[j]);}max = min = &a[0];for (i = 1; i < 10; i++) {if (*(a + i) > *max) {max = a + i;}else if (*(a + i) < *min) {min = a + i;}}t = *max, * max = a[9], a[9] = t;t = *min, * min = a[0], a[0] = t;for (k = 0; k < 10; k++){printf("%d ", a[k]);}return 0;}
3.两个变量交换
#include<stdio.h>void change(int* a, int*b){int t = 0;t=*a;* a = * b;* b = t;}int main(){int i=0, k=0;scanf_s("%d", &i);scanf_s("%d", &k);change(&i,&k);printf("%d %d", i, k);return 0;}
4.输出a[3][4]中的每一个元素
#include<stdio.h>int main(){int a[3][4] = { 1,2,3,4,5,6,7,8,9,10,11,12 };int a1[4] = { 1,2,3,4 };int a2[4] = { 5,6,7,8 };int a3[4] = { 9,10,11,12 };int i = 0,k=0;int* prr[3] = { a1,a2,a3 };for (i = 0; i < 4; i++){for (k = 0; k < 4; k++){printf("%d ", prr[i][k]);}printf("\n");}return 0;}
#include<stdio.h>int main(){int* p;int a[3][4] = { 1,2,3,4,5,6,7,8,9,10,11,12 };int i=0, j=0;for (p = a[0]; p < a[0] + 12; p++){if ((p - a[0]) % 4 == 0){printf("\n");}printf("%d", *p);}return 0;}
5.有一个班,3个学生,各学4门课,计算总平均分以及输出第n个学生的成绩
#include<stdio.h>int main(){int a[3][4] = { 1,2,3,4,5,6,7,8,9,1,2,3 };int i, j, k;int (*p)[4]=a;int sum = 0;for (i = 0; i < 12; i++){sum = sum + a[i];}float av = sum / 12.0;scanf_s("%d", &k);for (j = 0; j < 4; j++){printf("%d ", *(*(p + (k - 1)) + j));}return 0;}
三.结构体
1.什么是结构体
2.结构体申明
常用方法
结构体里面包含结构体
2.初始化和结构体里含有结构体的初始化以及变量输出
3.两种函数打印方式
4.