龙空技术网

C语言这些常见指针及数组等问题,有哪些是你给忘记了的?

职业小宝引导师 186

前言:

眼前同学们对“c语言数组使用经常出现的问题”都比较关怀,小伙伴们都需要知道一些“c语言数组使用经常出现的问题”的相关资讯。那么小编在网上搜集了一些关于“c语言数组使用经常出现的问题””的相关资讯,希望大家能喜欢,我们一起来学习一下吧!

什么是空指针和野指针?

1、空指针:不允许向NULL和非法地址进行拷贝内存;

2、野指针:

野指针一般有三种情况存在:

(1)、开始时未初始化指针;

(2)、开辟空间(malloc)后也释放(free)了,但是最后没对指针进行置空操作;

(3)、指针的操作超越了变量作用域。

如何用指针步长?

假设自定义一个数据类型,求类型中属性中的偏移量。首先一定要先导入<stddef.h>这个头文件,实现通过offsetof( 结构体类型 ,属性 )得到。代码如下所示:

#define _CRT_SECURE_NO_WARNINGS#include <stdio.h>#include <string.h>#include <stdlib.h>#include <stddef.h>struct myFunc{	char i; // 0 - 3	int j; // 4 - 7 	char arr[128]; // 8 - 135	int k; // 136 139};int main(){	struct myFunc m = { 'C',100,"helloworld",20 };	printf("%d\n", offsetof(struct myFunc, k)); //m中的k属性偏移量为136	printf("%d\n", m.k); // 20	/*	当然也可以通过下面方法取得属性值,一般不常用,代码实现复杂且易出错	*(int *)((char *)&m + offsetof(struct myFunc, k));	*/	system("pause");	return 0;}
如何对指针进行间接赋值?

指针间接赋值必须满足:普通变量和指针变量(或者一个实参一个形参)建立关系,通过 * 进行赋值。如下代码所示:

#define _CRT_SECURE_NO_WARNINGS#include <stdio.h>#include <string.h>#include <stdlib.h>void setval(int *b) {	*b = 100;}void test() {	int q = 30;	setval(&q);	printf("%d\n", q);}int main(){	test();	return 0;}
const有哪些使用场景?

一般可以加入const修饰函数中的形参,作用能有效防止误操作,也可以通过地址传递,节省空间的作用。

谨慎使用指针:

因为指针使用不当容易造成越界内存泄露等问题,如果指针叠加,它会不断改变指针指向,释放就会导致出错,这种情况就需要利用临时指针去指向那块内存。最后要注意避免在同一块内存中释放多次,同时不可以释放野指针

注意:

一级指针和二级指针做函数参数时,其输入输出特性是什么?

输入特性:在主调函数中分配内存,被调函数中使用;输出特性:在被调函数中分配内存,主调函数中使用;

数组本质上是一个指针吗?

不管是一维还是二维等数组本质不是一个指针,当然除了这两种情况之外,对数组名称进行sizeof(),或取地址的操作来获取指针步长得到整个数组的长度;除了这两个,都是指向数组中首元素地址的指针。

指针常量和常量指针有什么区别?

指针常量如 char * const c,指针的指向不可以被修改;

常量指针如 const char * c,指针的指向的值不可以被修改,指针指向可以被修改。

如何理解数组指针和指针数组?

1、所谓数组指针就是一个指向数组的指针,如 char (*a)[100];

2、指针数组就是数组中的每个元素都是指针的类型,是一个存放指针的数组如 char * a[100];

下面用指针数组用代码演示一下指针数组的用法,对指针数组利用选择排序的方法进行从小到大排序,如下所示:

#define _CRT_SECURE_NO_WARNINGS#include <stdio.h>#include <string.h>#include <stdlib.h>// 利用选择排序void selectSort(char *buf[], int len){	for (int x = 0; x< len; x++) {		// 设x为最大值下标		int max = x;		for (int i = x + 1; i < len; i++) {			if (strcmp(buf[max], buf[i]) == 1) {				max = i;			}		}		if (x != max) {			char* temp = buf[x];			buf[x] = buf[max];			buf[max] = temp;		}	}}void getArray(char * buf[], int len){	for (int i = 0; i < len; i++) {		printf("%s ",buf[i]);	}	printf("\n");}void test(){	// 从小到大排序	char * buf[] = { "ggg","ddd","qqq","hhh","eee" };	int len = sizeof(buf) / sizeof(buf[0]);	selectSort(buf, len);	getArray(buf, len);}int main(){	test(); // 结果为:ddd eee ggg hhh qqq	return 0;}

效果图如下所示:

标签: #c语言数组使用经常出现的问题