前言:
眼前同学们对“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语言数组使用经常出现的问题