c语言一维数组知识点与例题集合
panda2035
2024年04月21日 21:07

#include <stdio.h>

#include <stdlib.h>

#include <stdbool.h>

int main() {

//一维数组知识

int a[5] = {1,2,3}, i = 3;

int c = 2, f = 5;

a[0], a[1 + 2], a[i];//一维数组的合法引用形式

//数组元素就是变量的名字,有对应的存储空间,且整个存储空间是连续的

//在c语言中无法整体引用,只能用循环依次取出

//数组初始化:类型名 数组名[常量表达式等]={值0,值1,值2,...};

/*数组的赋值:1、可以给部分数组元素赋值,当数组元素的值岛屿数组的个数的时候,优先赋值给前几位数组元素,剩余的元素为不同类型的空值,如int为0,字符位空格

1、{}中的值个数不能超过数组元素的个数

3、之能给数组元素逐个赋值,不能给数组整体赋值*/

int arr[100] = {0};//初始化下标为数组个数

//初始化数组元素{}值的值为0,所有的数组元素都为0

int cc[] = {1,2,3,4,5};//数组在初始化时不指定数组个数的值,则数组的个数为{}中的个数

arr[1] = { 2};//初始化之后的下标为0开头的下标数

arr[99] = { 99 };

printf("%d",arr[99]);

}

int main()

{

int a[5]{1,2,3,4,5};

//数组名a代表了数组的首地址,是不可以被赋值的或者改变值

//将数组名赋值给指针变量,该指针就指向了该数组,此时这个指针变量等同于数组名,所以也不能作为被赋值和改值的对象,也就是左值。

//指针变量指向数组首元素就等于指向了整个数组

int* pa = a;//数组名赋值给指针变量,指针变量就指向了数组

//数组名本身就是数组的首地址,所以不需要取地址符

//指针定义的*是声明这是一个指针变量,引用已定义的指针变量加*,代表取指针名存的地址中的值

int* p = &a[0];//a[0]的地址赋值给指针变量,指针变量指向了数组

//数组名加下标为数组下表指定的值,并非地址,所以需要取地址符

int* pb;pb = a;//指针变量定义后,数组名赋值给指针变量名,指针变量就指向了数组

//数组名本身就是数组的首地址,所以不需要取地址符

int* pc;pc = &a[0];//指针变量定义后,数组首元素地址a[0]赋值给指针变量,指针变量指向了数组

int i;

//for (i = 0;i < 5;i++)

//{

// //scanf("%d", a + i);

// //数组名本身就是数组首地址,所以不需要取地址符,在scanf中a改值是更改下标的值,a加几则代表第几个元素,各种改值的方式只在scanf中适用

// scanf("%d",pa++);

// //在scanf中是先取值后加加,pa是指针变量名,存储的是地址,所以不用取地址符

// printf("%d\n", *pa);

// //printf("%d\n", *(pa+i));

// //指针pa指向a数组,pa+i依次指向了每个元素的地址,引用操作符 * 用于获取指针所指向地址处的值。

// pa++;//pa++依次指向了每个元素的地址

//}

for (pa = a;pa - a < 5;pa++)

{//指针名是可以做减操作的,前提是两个指针必须指向同一个数组,数组名存储的是数组首地址,

//指针运算会的值为类型数据的个数,pa指向int数组首元素,为4个字节,一个int类型元素在指针运算中为1,

//a作为数组名在指针变量中当做指针进行运算,a数组名存得是数组的首元素地址,首元素地址的元素是int,为4个字节,一个int类型元素在指针运算中为1

//pa-a等同于1-1

scanf("%d", pa);

printf("%d\n",*pa);

}

return 0;

}

函数对一位数组和数组元素的引用

int arry(int* a,int b)

{

int i=0;

while (i<b)

{

if (scanf("%d", a + i) != 1 || *(a + i) < 0)

break;

i++;

}

return i;

}

void out(int a,int* b)

{

int i;

for (i = 0;i < a;i++)

{

printf("%4d", *(b + i));

}

}

int main()

{

//数组元素作为函数实参,传递的是数组元素值。

//数组名作为函数的实参,传递的是数组首地址。

int a[100] = { 0 }, b;

b=arry(a, sizeof(a));

out(b, a);

return 0;

}

int main()

{//字符数组前四位不动,其余改为*

char a[10] = {'a','b','c','d','e','f','g','h','i','j'};

char* p = &a[4];

int i,b=5;

for (i = 0;i <= sizeof(a)-b;i++)

{

*(p + i) = '*';

}

for (i = 0;i < sizeof(a);i++)

{

printf("%c",a[i]);

}

return 0;

}

/*

定义15个元素的数组,并编写函数分别完成如下操作:

1、调用c库函数中的随机函数给所有元素赋0-49的随机值

2、输出数组元素的值

3、按顺序对每三个数求一个和数,并传回主函数,最后输出所有输出的和值

*/

#define SIZE 15

#define N 3

void getrandom(int* a,int b)

{

int i;

for (i = 0;i < b;i++)

{

*(a + i) = rand() % 50;

//rand为获取随机数,%50为限制在49以内的数,rand为库函数stdlib.h头文件中

}

}

void out(int* a,int b,int*c)

{

int i,j=0;

int e=0;

for (i = 0;i < b;i++)

{

printf("%4d",a[i]);

if ((i +1)% 5 == 0)

{

printf("\n");

}

e+=a[i];

if ((i+1) % N == 0)

{

c[j] = e;

e = 0;

j++;

}

}

printf("\n");

}

int main()

{

int a[SIZE], c[SIZE / N] = { 0 };

  getrandom(a, SIZE);

printf("output %d random numbers\n",SIZE);

out(a, SIZE,c);

printf("output %d three sum numbers\n",SIZE/N);

int i;

for (i = 0;i < SIZE/N;i++)

{

printf("%4d", c[i]);

}

printf("\n");

return 0;

}

将数组中的数按颠倒的顺序重新存放.在操作时,只能借助临时存储单元而不是另外开辟数组

#define SIZE 10

void invert(int *a,int b)

{

int i,j,t;

for (i = 0,j=(b-1);i < j;i++,j--)

{//i<j确保交换次数为5次,i从0开始,到4为5次,j从9开始,到5为5次。

  t = a[i];

a[i] = a[j];

a[j] = t;

}

}

void primaryout(int* a, int b)

{

for (int i = 0;i < SIZE;i++)

{

printf("%4d", a[i]);

if ((i + 1) % 5 == 0)

printf("\n");

}

}

int main()

{

int a[SIZE] = { 1,2,3,4,5,6,7,8,9,10 }, i;

printf("outpt primary numbers\n");

for (i = 0;i < SIZE;i++)

{

printf("%4d", a[i]);

if ((i + 1) % 5 == 0)

//i=0则第一次输出,i输出5次为4,则i+1=5即可判定换行

printf("\n");

}

invert(a, SIZE);

printf("outpt inverse numbers\n");

primaryout(a, SIZE);

return 0;

}

整型数组中的值在0-9的范围内,统计每个整型数组的个数

#define SIZE 50

#define N 10

void getrandom(int *a,int b)

{

int i;

for (i = 0;i < b;i++)

{

a[i] = rand() % 10;

}

}

void statistics(int* a, int b,int *c)

{

int i;

for (i = 0;i < b;i++)

{

c[a[i]] += 1;

//c数组的下标用于统计a数组的数出现几次

}

}

void outrandom(int *a,int b)

{

for (int i = 0;i < b;i++)

{

printf("%4d",a[i]);

if ((i + 1) % 5 == 0)

printf("\n");

}

}

void outstatistics(int* a, int b)

{

for (int i = 0;i < b;i++)

{

printf("%d:%d ",i, a[i]);

if ((i + 1) % 5 == 0)

printf("\n");

}

}

int main()

{

int a[SIZE] = { 0 };

int c[N] = {0};

//c的长度为统计数的范围

getrandom(a, SIZE);

statistics(a, SIZE, c);

printf("random %d numbers\n",SIZE);

outrandom(a, SIZE);

printf("out statistics nembers\n");

outstatistics(c,N);

return 0;

}

/*

在数组中查找和x之相同的元素位置,并输出该值在数组中的位置,没找到则输出-1;

*/

int a(int* a, int b)

{

int lift,right;

lift = 0;

right = sizeof(a) / sizeof(a[0]);

while (lift<right)

{

int midle = lift + (right - lift / 2);

if (midle == b)

{

return midle;

}

else if (midle < b)

lift = midle;

else

right = midle;

}

return -1;

}

int main()

{

int a[5] = { 1,2,3,4,5 };

int b,x = 4;

b=(a, x);

printf("%d", b);

return 0;

}

#define NUM 30

void arrin(int* a,int n)

{

int i;

for (i = 0;i < n;i++)

{

a[i] = i + 1;

}

}

int serch(int *a,int n,int x)

{

int i;

for (i = 0;i < n;i++)

{

if (a[i] == x)

{

return i;

}

}

return -1;

}

int main()

{

int* a[NUM] = { 0 };

int b, x;

arrin(a,NUM);

printf("enter x number:");

scanf_s("%d",&x);

b = serch(a, NUM, x);

if (b)

printf("下标为:%d", b);

else

printf("not fine number");

return 0;

}

w数组中存放n个数据,编写函数删除下标为k的元素的值

#define N 10

void arrin(int* w, int n)

{

int i;

printf("arry number:\n");

for (i = 0;i < n;i++)

{

w[i] = i;

printf("%4d", w[i]);

if ((i + 1) % 5 == 0)

printf("\n");

}

}

int getindex(int n)

{

int i;

do {

printf("enter the index:0-%d:", n - 1);

scanf("%d", &i);

} while(i<0||i>n-1);

return i;

}

int delete (int* w, int k,int n)

{

int i;

for (i = k;i < n-1;i++)

{//n-1因为下标为n的元素不需要改值

w[i] = w[i + 1];

} //数组下标元素得到前一位下标元素的值

return n-1;

}

void outarray(int* w, int n)

{

for (int i = 0;i < n;i++)

{

printf("%4d", w[i]);

if ((i + 1) % 5 == 0)

printf("\n");

}

}

int main()

{

int w[N] = { 0 };

int k,n=N;

arrin(w,n);

k = getindex(n);

  n=delete(w, k,n);

outarry(w,n);

return 0;

}

用选择法对数组中的数进行排序

#define N 6

void arrinrand(int* a, int n)

{

for (int i = 0;i < n;i++)

{

a[i] = rand() % 11;

printf("%4d", a[i]);

if ((i + 1) % 6 == 0)

printf("\n");

}

}

void arraysort(int* a, int n)

{

int i, j, p,t;

for (i = 0;i < n;i++)

{

p = i;

for (j = i + 1;j< n;j++)

{

if (a[p] > a[j])

{

p = j;

}

if (p != i)

{

t = a[p];

a[p] = a[i];

a[i] = t;

}

}

}

}

void outarray(int *a,int n)

{

int i;

for(i=0;i<n;i++)

printf("%4d", a[i]);

if ((i + 1) % 6 == 0)

printf("\n");

}

}

int main()

{

int a[N] = {0};

arrinrand(a, N);

arraysort(a,N);

outarray(a,N);

return 0;

}