《C语言解惑》—— 2.8 一维数组更要特殊对待

2.8 一维数组更要特殊对待

字符串也是一维数组,但它很特殊,所以这里说的一维数组不包含它,而是指数字数组,即整数数组和实数数组,也就是数值数组。如果抄袭字符串的形式来输出数组的全部内容,有可能会写出如下的错误程序。

#include <stdio.h>
void main ( )
{
  int a[3]={1,2,3};
  printf("%d\n",a);
}

这个程序本身是正确的,问题是它输出的内容不符合要求。字符串可以使用printf函数一次输出,但数值数组只能一次一个地输出。上述程序中使用的 printf语句格式输出的不是数组的内容,而是数组存储的首地址。a的内容必须一个一个地输出,即

printf("%d ",a[0]);  printf("%d ",a[1]);  printf("%d ",a[2]);

可以使用如下循环语句的形式输出:

for(i=0;i<3;i++)
    printf("%d ",a[i]);

【例2.11】下面程序输出的是数组的内容吗?

#include <stdio.h>
void main ( )
{
  int a[3]={1,2,3};
  int i=0;
  for(i=0;i<3;i++)
     printf("%d ",&a[i]);
  printf("%d\n",a);
}

这个程序不是输出数组的内容。因为在for循环语句

for(i=0;i<3;i++)
      printf("%d ",&a[i]);

中,&a[i]表示数组各个元素的地址。i=0时,&a[0]和a一样,均表示数组a的首地址,所以语句

printf("%d ",&a[0]);

和语句

printf("%d ",a);

的输出内容是相同的。随着i的变化,&a[i]将分别对应数组a的各个元素的地址。程序输出内容如下:

1245044 1245048 1245052 1245044

正如分析的一样,第1项和第4项的输出相同。
输出内容应使用数组元素的名字a[i],即

for(i=0;i<3;i++)
    printf("%d ",a[i]);

如果先定义数组,如何为数组元素赋值呢?scanf要求的是存储元素的地址。普通变量是在变量前加“&”号,数组元素的标记也是使用“&”号,所以可以一个一个地赋值。
【例2.12】使用scanf语句为数组赋值的例子。

#include <stdio.h>
void main ( )
{
     int a[3],i;
     printf("输入数组内容:");
     for(i=0;i<3;i++)
          scanf("%d",&a[i]);
     printf("输出数组内容:");
     for(i=0;i<3;i++)
          printf("%d ",a[i]);
     printf("\n");
 }

程序运行示范如下。
输入数组内容:3 5 7
输出数组内容:3 5 7

时间: 2024-10-24 19:11:57

《C语言解惑》—— 2.8 一维数组更要特殊对待的相关文章

《C语言解惑》—— 导读

前 言 C语言编程仍然是编程工作者必备的技能.目前有四类典型的学习C语言的教材:第一类是以讲授语法为主线,即流行的教科书方式,所涉及的例题均以正确的程序为主:第二类是以案例教学为主的教材,摆脱了语法的部分约束:第三类是以讲解编程技术为主的经验之作,主要针对已有编程基础的读者:第四类是针对编程容易产生错误的专题,对比正确与错误的程序以提高编程能力,涉及的内容比较专业.这些教材各有千秋,其共同的目的都是想教会读者如何编写正确.规范的程序.我们也曾在两部教材的每一章中尝试增加一节错误分析的内容,以期让

如何将一维数组的元素赋值于一个临时的字符串??请教

问题描述 RT语言为vb.net一维数组为f(n)str为string想用一个循环,依次将数组中的每一个元素赋值给str供其后的代码使用,譬如:Fori=0Ton-1strs=f(i)程序提示错误,"无法转为一维阵列属于object",请教该如何解决?? 解决方案 解决方案二:举例:strs=strs+f(i).ToString+vbcrlf解决方案三:这里有一段代码,实现的是:若(第一组)f1(第二组)f1:f2(第三组)f1:f2:f3(第四组)f1:f2:f3:f2(第五组)f1

编程-如何用C语言的一维数组对一个元素的增删改

问题描述 如何用C语言的一维数组对一个元素的增删改 今天老师讲了C语言的一维数组,就是大批量处理数据的一个工具,他说自己回去 思考增删改查,唯独删除我理解不到,哪位大神可否指点迷津!多谢多谢啦 解决方案 比如,你确认你的数组中存放的都是整数,你可以将这个元素置为-1表示删除.增加就是先检查你的数组中有没有-1的元素,如果有,就设置为你的值.如果全部都满了,就开一个更大的数组,把数据拷贝过去. 解决方案二: 数组是数据结构中的顺序存储结构,删除就是将其下标所在位置的中的内容置为空(也就是0),然后

c 图像 jpeg 数组-c语言把一维数组保存成jpeg,怎么做比较方便啊?

问题描述 c语言把一维数组保存成jpeg,怎么做比较方便啊? 在VC环境下用C语言做信号处理得到一个存储图像数据的一维无符号字符型数组,数组的每一个元素存储一个灰度值,代表一个像素.现在我想把这个一维数组保存成一个jpeg(或者bmp)格式的图像文件, 百度到一些图像处理的库像opencv, Cimag,但不知道哪个适合解决这个问题以及怎么用. 用C语言的方法怎么样做比较方便?C++也可以,但最好是C. 解决方案 根据bmp的文件格式,自己写个保存函数,不难

C语言一维数组入门教程

一.一维数组 1.定义一个一维数组: (1)格式:存储类别   类型标识符  数组名标识符[常量表达式] (2)例子:static int a[10] (3)注意:定义数组时数组的元素必须是常量,不能是变量,例如int n=3;int a[n] 这是不对的. 2.对数组的引用: (1)引用形式:数组名[下标] 例如 a[2]  ( 2) 注意数组的下标是由0开始,如a[3] 表示有三个元素 分别是a[0],a[1] ,a[2] .如果你用a[3]访问第三个元素是错误的. (3)对数组的遍历:如果

C语言一维数组初步学习笔记_C 语言

数组 可以存储一组或者多组数值的变量,里面包含多个元素,数组的每个成员都是一个数组元素. 一维数组 定义:类型 数组名[常量表达式] = {值1, 值2, 值3-}; int a[3] = {0, 1, 2}; float f[2] = {1.2, 2.3, 3.14}; char str[] = {'h', 'e', 'l', 'l', 'o'}; chat str1 = "iPhone";//这也是定义字符数组的方法,字符数组后面会详细讲解,这里先了解一下 当数组元素个数为变量时,

c语言-可以定义一个多大的一维数组?

问题描述 可以定义一个多大的一维数组? int allPixel[480*640]; 直接stackoverflow 爆掉了? char allPixel[480*640]; 倒是可以 解决方案 这要看看你的栈有多大了,但是vc中你可以扩大你的栈区,最大为4M吧 解决方案二: int占2个字节,char只占一个字节 解决方案三: 好像是因为在vs里面跑.c

c语言-两个一维数组相乘,每组数组有五个整型元素

问题描述 两个一维数组相乘,每组数组有五个整型元素 两个一维数组对应元素相乘,每组有5个整型元素,输出乘积,不知道怎么做 解决方案 #include <stdio.h> #include <stdlib.h> void main() { int a[5],b[5],c[5],i; printf("输入数组a:n"); for( i = 0;i < 5;i++) { scanf("%d",&a[i]); } printf(&quo

c语言-关于字符串保存到一个一维数组

问题描述 关于字符串保存到一个一维数组 利用sprintf(list,"d:sift(%d).jpg",i); i的值从1到100 要用一个数组来访问这些字符串 如ch[0]的话访问d:sift(0).jpg 如ch[1]的话访问d:sift(1).jpg 如ch[2]的话访问d:sift(2).jpg ...... 如何实现? 解决方案 使用字符的数组的数组 或者说指向"指向字符的指针"的指针 解决方案二: 你需要数组的数组 char ch[100][]; 解决方