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";//这也是定义字符数组的方法,字符数组后面会详细讲解,这里先了解一下

当数组元素个数为变量时,只能声明数组,不能直接赋值:

int length = 4;
int a[length]; //这样可以
int a[length] = {2, 4, 6, 8};//这样的话就会报错

注意事项:

1、系统不会检测数组元素的下标是否越界,编程时,必须保证数组下标不能越界。

2、不能这样定义数组 int array[] = {}; //数组个数和初始值不能同时为空

3、也不能这样定义数组 int array[2] = {1, 2, 3}; //数组的值的个数大于数组的个数

4、数组是一个整体,不能直接参加运算,只能对单个元素进行处理,通常用到数组的地方都会用到循环

常见数组操作
如果初始化数组的时候,数组的元素个数确定,那么常量表达式可以不写:

int a[] = {1, 3, 5, 7, 9};//数组的长度为5 相当于int a[5] = {1, 3, 5, 7, 9};

int 就是数组类型,表示这个数组中的每个元素都是 int 类型。

访问:通过数组名+下标去访问数组中的元素,而且注意数组的下标是从 0 开始的,a[0] 就是第一个元素,a[1] 代表第二个元素,a[2] 代表第三个元素。所以数组的最后一个元素就是 数组的长度 – 1,一定不要写a[3],这样的话就属于数组越界。

在数组的访问的时候我们通常会通过 for 循环来操作,这个操作一般称为遍历

int ages[28];
//循环赋值
for(int i = 0; i < 28; i++)
{
  int age = arc4random() % 13 + 18;//每个人的年龄的范围是:18 ~ 30 之间的随机值
  ages[i] = age;//给每个元素赋值
}
//访问,也叫遍历
for(int i = 0; i < 28; i++)
{
  printf("a[%d] = %d ", i, ages[i]);
}

两个数组的每个元素对应相加,相加的和存放到第三个数组中:

int a1[] = {2, 4, 5, 6, 10};
int a2[] = {1, 3, 4, 5, 6};
int a3[5];
for(int i = 0; i < 5; i++)
{
  a3[i] = a1[i] + a2[i];
  printf("a3[%d] = %d ", i, a3[i]);
}

输出结果为:

a3[0] = 3 a3[1] = 7 a3[2] = 9 a3[3] = 11 a3[4] = 16

数组的长度如何计算:

sizeof(数组名)/sizeof(数组第一个元素)

int arr[] = {2, 3, 4, 6, 7};
int length = sizeof(arr) / sizeof(arr[0]);
printf("length = %d\n", length);

输出结果为:

length = 5

字符数组:用于存放字符变量的数组称为字符数组,有两种定义格式:

char str[4] = {'a', 'b', 'c', 'd'};
char str2[] = "iPhone";//另外一种方式

字符串的输出:

printf("str2 = %s\n", str2);//%s 输出字符串,遇到 '\0' 结束

有'\0'结束标识的字符数组也称为字符串,系统提供了许多的一些字符串的函数

size_t strlen(const char *):计算字符串长度,是字符串的有效长度,不算'\0′

char str[] = "iPhone";
unsigned long length = strlen(str);//strlen 表示有效长度
printf("length = %lu\n", length);

输出结果为:

length = 6

strlen() 的实现原理:就是遍历字符串,当遇到 ‘\0′ 的时候就结束。

char *strcpy(char *, const char *):字符串拷贝

char str1[] = "Unity";
char str2[] = "Android.....";
printf("%s\n", strcpy(str1, str2));

输出结果:

Android

char *strcat(char *, const char *):字符串拼接

char str1[] = "Unity";
char str2[] = " iPhone";
printf("%s\n", strcat(str1, str2));

输出结果:

Unity iPhone

int strcmp(const char str1*, const char str2*):字符串比较,并且根据 str1 按照字典顺序小于、等于或大于 str2 的结果分别返回负整数、0或正整数。该返回值是 str1 和 str2 由前向后逐字符比较时遇到的第一个不相等字符处的字符的差值

char str1[] = "Unity";
char str2[] = "iPhone";
printf("%d\n", strcmp(str1, str2));

输出结果:

复制代码 代码如下:

-20

指针访问数组
如果pa指向数组中的某个元素,那么pa+1将指向下一个元素,pa+i指向下i个元素。所以,若果pa指向a[0],那么*pa其实就是a[0],*(pa+1)就是a[1],*(pa+i)就是a[i]。根据这个思路,我们可以使用指针来访问数组。

#include <stdio.h>
int main(int argc, char *argv[])
{
 int score[10]={76,85,90,67,59,79,82,95,91,65};
 int wait, length, i;
 length = sizeof(score) / sizeof(score[0]);
 for(i = 0; i < length; i++)
 {
 printf("%d \n", *(score + i));
 }
 scanf("%d", &wait);
}

程序输出:

76
85
90
67
59
79
82
95
91
65

数组下标与指针关系很密切。执行语句 pa = &a[0] 后,pa 和 a 就具有相同的值了,并且 *pa=a[0]。实际上C语言在计算数组下标时也是使用指针来完成的。下标与指针其实是等价的。

当把一个数组名传递给一个函数的时候,实际上传递的是该数组的第一个元素的地址。所以,数组名参数必须是一个指针。

计算字符串长度的程序可以写成以下:

int strlen(char *s)
{
 int n;

  for(n = 0; *s != '\0'; s++)
   n++;
  return n;
}

s 是指针,也就是一个变量,对它进行自增是合法的。

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索c语言
, 数组
一维数组
,以便于您获取更多的相关知识。

时间: 2024-09-13 13:51:17

C语言一维数组初步学习笔记_C 语言的相关文章

C语言柔性数组实例详解_C 语言

本文实例分析了C语言柔性数组的概念及用法,对于进一步学习C程序设计有一定的借鉴价值.分享给大家供大家参考.具体如下: 一般来说,结构中最后一个元素允许是未知大小的数组,这个数组就是柔性数组.但结构中的柔性数组前面必须至少一个其他成员,柔性数组成员允许结构中包含一个大小可变的数组,sizeof返回的这种结构大小不包括柔性数组的内存.包含柔数组成员的结构用malloc函数进行内存的动态分配,且分配的内存应该大于结构的大小以适应柔性数组的预期大小.柔性数组到底如何使用? 不完整类型 C和C++对于不完

一波C语言字符数组实用技巧集锦_C 语言

字符数组倒序 #include <stdio.h> void daoxu(char str[]){ int i; char temp; for(i = 0; i < strlen(str) / 2 ; i ++){ temp = str[i]; str[i] = str[strlen(str) - i-1]; str[strlen(str) - i-1] = temp; } } 单词计数    int wordCount(char str[]){ int i; int count = 0

关于《C和指针》的学习笔记_C 语言

有了之前的基础,此文只是把一些以前没有注意到的和值得学习的知识做一个记录. 第一章 作者认为使用#if 0 .... #endif比用/*和*/好,因为后者不能嵌套.但是对于//并没有说明. 第二章 三字母词,用两个问号加一个符号表示另一个符号,比较类似于转义字符.查阅了一些资料,它的使用与编译器有关,了解即可,防止字符串常量被错误的解释. 复制代码 代码如下: ??( ==> [ ??< ==> { ??= ==> #  ??) ==> ] ??> ==> }

C++中的vector容器对象学习笔记_C 语言

C++中数组很坑,有没有类似Python中list的数据类型呢?类似的就是vector! vector 是同一种类型的对象的集合 ,每个对象都有一个对应的整数索引值.和 string 对象一样,标准库将负责管理与存储元素相关的内存. 我们把 vector 称为容器,是因为它可以包含其他对象 . 一个容器中的所有对象都必须是同一种类型的 . vector对象的定义和初始化 同样的,使用前,导入头文件#include <vector> 可以使用using声明:using std::vector;

C语言中的函数指针学习笔记_C 语言

一.定义函数指针 return_type (*func_pointer)(parameter_list) 普通指针变量的定义 int * p; char * pointer; 类型的限定都在变量前面: 函数指针类型的限定是前后都有,前面是返回类型,后面是输入参数. 利用typedef 可以简化上面的表达方式. typedef return_type (*FunctionPointer) (parameter_list); FunctionPointer func_pointer; 这样是不是容易

C语言返回数组的学习笔记

问题来源于今天三班一个学霸问我,他的程序没法运行,什么情况? 那来看看他写的程序,虽然看着有些不舒服.  代码如下 复制代码 #include <stdio.h> #include <string.h> int main() {  char tra(char str[]);  char b[80];  gets(b);  puts(tra(b)); return 0; } char tra(char str[]) {  char stri[80]; int i,j,k=0; i=s

C语言实现在数组A上有序合并数组B的方法_C 语言

本文实例讲述了C语言实现在数组A上有序合并数组B的方法,分享给大家供大家参考.具体分析如下: 题目:数组A和数组B均有序,数组A有足够大内存来容纳数组B,将数组B有序合并到数组A中 分析:如果由前至后合并,复杂度将会是O(N2),这样的复杂度显然不是最优解,利用两个指针指向两个数组的尾部,从后往前遍历,这样的复杂度为O(n2) 由此可以写出下面的代码: #include <iostream> #include <algorithm> #include <iterator>

简单分析C语言中指针数组与数组指针的区别_C 语言

首先来分别看一下,指针数组的一个小例子: #include <stdio.h> #include <string.h> int lookup_keyword(const char*key, const char* table[], const int size) { int ret = -1; int i = 0; for(i=0; i<size; i++) { if (strcmp(key, table[i]) == 0) { ret = i; break; } } ret

C语言的数组学习入门之对数组初始化的操作_C 语言

数组在所有的语言中,以C最为简单,就是一起始地址,外加一数组的长度,而且基本上没有任何功能可言.然而,在所有的数组使用中,却是C的这种简单的数组形式,以其灵活性和效率,让人惊叹. C数组从逻辑上讲,是分形一致的(想不到其他词来形容了),分形的意思,就是部分与整体保持一致的构造形式,也即是数组的任何一部分也都是数组,比如一整型数组{1,2,3,4,5},连续取出其中任一连续的部分,都可以看成是一个数组,{2,3}是数组,{1,2,3}是数组,{4,5}也都是数组,差别只在于数组的起始地址和元素的个