浅议C语言中数组和指针的互操作

曾听好多朋友说,C是一种怀旧的语言,因为它的历史很久远,然而自从各种面向对象的编程语言的相续出现让它的影响力日减。

当然了,这是无可非议的,但是C的高效性是其他语言无妨比拟的,所以我们有必要把握其中的精华与奥妙,也就有必要知道其中的基本的数据结构的比如数组,稍微有点深度的堆栈、列表、结构体等的操作和实现。指针也是C语言中的一个很优秀灵活的结构,对它的了解也是必不可少的。

我们一般都认为数组是一维的数据存储结构,因为二位数组或者说矩阵都可以看作是多个一维数组的组合结构,定义在其上的数据存储访问方式是一样的。所以一维数组是其中最基础的最重要的部分,只有理解了此类数据结构的本质才能触类旁通了。

数组(array)是若干同类变量的聚合,允许通过统一的名字饮用其中的变量。所以数组也就是一个同一类型的数据的有限集合。可以通过下表来访问数组中的某一/些数组元素。

在C语言中数组都由连续的内存区域构成(有时候,不一定是这样),最低地址对应首元素,数组的下标是从0开始的,所以首元素也就是数组下标为0的元素,最高的地址对应最末的元素,即第N-1个元素(如果我们定义的数组为N元)。

数组的定义方式:

在C语言中允许在声明数组的时候同时对其进行初始化,也可以把声明和定义放在不同的位置,初始化的一般的类似于如下的表达式:

type_specifier array_name[size1]...[sizeN] = {value_list};

其中vlaue_list是由逗号(,)分隔的常量表,常量表必须和type_specifier兼容。最后由分号与下一个语句分隔。由此可见一维数组的定义方式为:type_specifier
array_name[size] = {value_list};

如下:

char hello[12] = {’H’,’e’,’l’,’l’,’o’,’,’
,’ ’,’w’,’o’,’r’,’l’,’d’,’\0’};

注意:字符数组是一"’\0’"收尾的,这是C标准的一部分。因为在操作字符数组的时候是以’\0’作为结束判断的标志。当然了,如果你定义的是一个字符串那就不用加这个’\0’了。因为有机制帮助你自动添加。

上面的例子的串的生命方式为:string hello = "Hello, world";(当然了,具体的实现中你必须把"string.h"头文件加入到你的文件中),或者你也可以这样来声明:

char *hello = "Hello, world";
或者
char hello[] = "Hello, world";

切换为字符指针数组,其效果是一样的);数组初始化的时候还可 以不标明最大小,即char hello[] = {’H’,’e’,’l’,’l’,’o’
,’,’,’ ’,’w’,’o’,’r’,’l’,’d’,’\0’};,

这时候编译器会根据后边的赋值情况为数组分配合适的内存空间,这个你不用担忧,除非机器正处于内存缺状态。

时间: 2024-09-04 03:24:58

浅议C语言中数组和指针的互操作的相关文章

再谈C语言中数组和指针之间的互操作

我曾说过,在C语言中只有一维的数组(这是我对数组的看法),而且数组元素可以是任何类型的数据(或对象),自然也可以是另外的一个数组(因为数组也是一种数据类型).所以如果你坚持要说有多维数组,那也不是不可能的事情.我们只要把一个数组赋值给另一个数组的元素就可以了.当然了,我们必须保证在程序编译期数组的大小是一个固定的常数. 其实,数组的操作很简单的.只要我们确定一个数组的大小和指向该数组下标为0的元素的指针,其他的任何一个数组下标的运算都等同于一个对应的指针运算,所以我们说"数组和指针是可以相互操作

malloc-C语言中的字符指针操作问题,如何释放字符指针空间?

问题描述 C语言中的字符指针操作问题,如何释放字符指针空间? 源码如下: #include #include #include void main() { char s1; char *s2 = "bbb"; char *s3 = "ccc"; s1 = (char)malloc(sizeof(s2)); strcpy(s1, s2); strcat(s1, s3); //free(s2); //free(s3); printf("%s ", s

希望大神帮助下-关于C语言中数组的输出,求…………

问题描述 关于C语言中数组的输出,求---- #include int main() {int i,a[10]; for(i=1;i<=10;i++) a[i]=i; printf("%d ",a); return 0; } 怎么才可以输出这样形式呢? 12345678910 为什么老是输出 1244960 这种形式呢?谢谢! } 解决方案 printf("%d ",a[i]); C语言中的数组输出不能整体输出,的用for循环依次输出每一个元素 数组名就像一个

c语言-初学C语言中数组下标的问题

问题描述 初学C语言中数组下标的问题 void strtol(char s[]){ int i=0; while(s[i++]); while(i>=0) s[i--]=s[i]; } 发现没有报错,怎么解释呢 显然会出现s[0]=s[-1]不是吗 解决方案 s[i--]=s[i]; 这个执行的是s[i]=s[i]; i--; 再说了,就算数组访问下溢,也不会报错. 解决方案二: s[-1]相当于*(s-1),也就是说数组的第一项之前的一字节内存.越界了.编译器没有你想象的那么智能,所以没报错

编程c语言-C语言中数组的元素如果不赋值会改变吗

问题描述 C语言中数组的元素如果不赋值会改变吗 做了一个循环,循环里是一个if判断,如果是真就给数组赋值,正常的话只会做一次,然后就不会在给数组赋值了,结果做完整个循环后,被赋值的数组的数又全变成初始的0了,这是怎么回事. 解决方案 看你的代码,找到之后,需要用break跳出循环.如果是函数调用,检查下形参和实参. 解决方案二: 源码贴出来,凭空没法诊断.有可能是数组寿命到了,或者其他原因 解决方案三: 加一个flag判断一下,如果是第一次就正常使用,如何不是,就退出 解决方案四: 你赋的值就是

c语言-C语言中数组中的 怎样打印到屏幕上

问题描述 C语言中数组中的 n 怎样打印到屏幕上 比如说 一个字符串 数组 char a [] = {'n'}; 想要在屏幕上显示 n 这个字样该怎么实现? 解决方案 你是要打印n两个字符么?如果时的话,可以这样 char a [] = {"\n"}; 解决方案二: char a[] = "n";然后输出就ok了:因为这里是转义字符,要输出斜杠的话必须要写成的形式 解决方案三: 查找替换,将n替换成\n 解决方案四: n是换行符号,如果要单纯显示"n&qu

c语言-C语言字符数组和指针的关系

问题描述 C语言字符数组和指针的关系 #include using namespace std; void reverse(char* s) { char *p,*q,temp; p = s; q = s + strlen(s) - 1; while(p<q) { temp = *p; *p = *q; p++; q--; } } int main() { char name[] = "abcdef"; //为什么换成 char* name = "abcdef"

浅谈c语言中类型隐性转换的坑_C 语言

谨记:在C语言中,当两种不同类型之间运算时,低字节长度类型会向高自己长度类型转换,有符号会向无符号类型转换. 举例子如下: #include <stdio.h> void func(void) { int i = 1; unsigned char c1 = 1; signed char c2 = -1; if (c2 > i){ printf("\r\n -1 > 1"); } else{ printf("\r\n -1 <= 1");

c语言中数组名a和&amp;a详细介绍

其实这两个东西挺难理解的,应该也没有那么重要,了解一下好了,主要还是要多多理解数组指针的运算 最近又把学习c语言提上日程上来了~~~先把我打算看的书都写下来吧,<C语言深度剖析>,<c和指针>系类,<c语言陷阱和缺陷> 先说说a和&a的区别(有三点,三个方向): 是a和&a的本质,都是什么类型的. 从2维数组的角度看. 从指针运算的角度看. 声明:虽然数组名不是指针,但是用的很像指针,我们暂且把它叫做一个指针吧. 第一个问题: int a[10]; a