一.指针初阶
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.