笔者曾学过一阵labview,在labview中,首先创建空的数组框,随后将int整型,或str字符串型变量放入数组框内,就实现了数组的生成。
1.字符串型数组
labview与c的逻辑很相似。但在c语言中,很少有处理字符串类型的函数,c语言实际上是将字符串拆成单个字符,然后将单个字符连续储存在数组向内存申请的字节内。
我们来看一串代码
char arr1[] = { 'a','b','c' };
char arr2[20] = "abc";
同样是保存字符串信息”abc“,两者采取了不同的方式实现分别储存单独字符的功能
第一行代码是声明一个char型数组,该数组向内存申请的储存字节的多少根据右侧元素的多少决定。显然三个字符元素需要三个字符储存空间即3个字节。
第二行是代码同样是声明一个要求20个字节空间的char型数组,但是我们直接向该数组赋值字符串”abc“,编译器在读取字符串的双引号时,会自动在末尾添加元素\0,所以实际上,我们占用了申请的二十个字节中的前四个字节。
我们用一个□表示一个字节,实际存储情况如下:
a b c
□ □ □
a b c \0
□ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □
我们在用sizeof()操作符时,会读取该数组向内存申请的储存空间。
执行以下打印代码
printf("%d\n", sizeof(arr1));
printf("%d\n\n", strlen(arr1));//考虑一下为什么是随机值。
printf("%d\n", sizeof(arr2));
printf("%d\n\n", strlen(arr2));
显然,结果为
3
随机值
20
3
为什么在使用strlen()函数时第一种数组赋值方法会出现?
我们知道,strlen是通过在读到\0后,返回遍历\0前面所有字符的个数(不含\0)。第二种的返回值为3是因为编译器会主动在“”之间加上\0,而第一种赋值方法因为字节内没有\0字符的存在,该函数会一直执行直到遇到\0字符。
2.整型数组
这里先阐明一下什么是数组名。我们来考虑如下问题:
当我们设置如下一个数组时,数组名指的什么?
int arr1[] = {1,2,3}
这里直接给出答案。数组名是一种特殊的数据结构,这种结构会体现两方面的性质。
1)指针性质。当涉及函数传参,或者函数打印时,数组名体现的是指针性质。指针指向第一个数组元素。
printf("%p\n", &arr1);
printf("%p\n", arr1);
结果均为数组元素1的储存地址。
但那就确定数组名就是指针吗?我们再看下面一段代码:
printf("%d\n", sizeof(arr1));
如果arr1是指针,指针占用的内存在64位系统中与int型一致,为4个字节,那这串代码打印的是4吗?并不是。其结果为12,显然为数组内元素个数为3,每个元素占用字节为4,12 = 3*4,而在此时,数组名体现的又是整个数组的某种性质。为什么会有这种差异?
作为一个初学者,笔者认为这种差异实际上是操作符和函数的差异。sizeof作为操作符,它处理数组时是很贴近数组实质的(一串连续地址储存数组元素),所以用操作符操作数组就会体现出处整个数组的特性。
而函数是较外层的处理数组的操作方式,数组名作为一个体现数组性质的数据结构,在被外层的函数调用时,它的某些整体性质丢失了,剩下的只有指针性质。这可能是因为数组名所代指的数组是个极其占用内存的东西,如果函数接收到的是整个数组的性质,那函数会向内存申请相当大的空间造成空间的浪费和代码效率下降。
既然如此,我使用数组名的指针性质,即如果我能找到第一个元素,那我就能找到数组的所有元素。这样就能解决上述问题。当然代价就是数组名丢失了一些整体性质,功能变得单一化了。
解决了上述数组名的问题,我们来看一个冒泡排序函数的编写。
实例
void bubble_sort(int arr[], int sz)
{
int i = 0;
for (i = 0; i < sz - 1; i++)
{
int j = 0;
for (j = 0; j < sz - 1 - i; j++)
{
if (arr[j] > arr[j + 1])
{
int tmp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = tmp;
}
}
}
}
int main()
{
int arr[] = { 2,8,9,4,5,3,1,7 };
int i = 0;
int sz = sizeof(arr) / sizeof(arr[0]);
bubble_sort(arr, sz);
for (i = 0; i <= sz; i++)
{
printf("%d", arr[i]);
}
return 0;
}
执行逻辑省略了。。。做核酸去了