#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;
}