c语言指针和结构体(B站鹏哥讲解版)

一.指针初阶

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.

  • 4
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值