数组
为什么需要数组 大量数据不关心数据名称的时候
数组的基本使用
数组定义: 类型 数组名 数组大小 int array[10]
数组单独访问:数组的中括号[] 只有在定义一个数组的时候,才表示数组大小,其余任何情况,都表示用下标来访问数组
循环的方式遍历数组
地址连续两个元素之间地址连续
#include <stdio.h>
#include <stdlib.h>
int main()
{
int i;
int a1[100];//没哟初始化的数组
int a2[10] = {1,2,3,4,5,6,7,8,9,10};//有初始化 完整的数组
int a3[100] = {1,2,3};// 有初始化 不完整的数组
int scores[10] = {0};
int min = 100;
int max = 0;
int total;
float avg;
//数组中的括号[] 只有在定义的时候 才表示数组大小 期许任何情况下 都表示用下表来访问数组
for(i=0;i<10;i++){
printf("请输入第%d个人的成绩\n",i+1);
scanf("%d",&scores[i]);
if(scores[i]<0 || scores[i]>100){
printf("sb\n");
exit(-1);
}
}
for(i=0;i<10;i++){
if(max < scores[i]){
max = scores[i];
}
}
for(i=0;i<10;i++){
if(min > scores[i]){
min > scores[i];
}
}
for(i=0;i<10;i++){
total = total + scores[i];
}
avg = (float)total/i;
printf("max:%d\n",max);
printf("min:%d\n",min);
printf("avg:%.2f\n",avg);
return 0;
}
~
3 数组和函数
实际参数的表示方式-数组当做参数,传递的是数组的首地址:第一个数组元素的地址.数组名
形式参数为数组
数组中括号中的数组大小无效
中括号此时仅作为该形参是一个数组首地址的说明void printArray(int array[])
函数中对数组的操作,除了带一个数组首地址以外,一般还需要一个代表数组个数的实际参数
#include <stdio.h>
#include <stdlib.h>
void arrayPrint(int datas[], int cnt)//这里的中括号的作用仅仅用来表示,是一个地址Linux64为中表示8个字节
{
int a = sizeof(datas);
printf("datas[]的大小为%d\n",a);
int i;
for(i=0;i<cnt;i++){
printf("%d ",datas[i]);
}
putchar('\n');
}
int main()
{
int a[5] = {10,24,39,45,95};
char b[3];
int c = sizeof(a)/sizeof(a[0]);//sizeof(a)/sizeof(int)
//数组中元素的个数 = 数组的总大小/一个类型的大小
int d = sizeof(a)/sizeof(a[0]);//sizeof(b)/sizeof(char)
printf("a数组的个数为%d\n",c);
printf("b数组的个数为%d\n",d);
arrayPrint(a,c);
arrayPrint(&a[0],c);
return 0;
}
结果
a数组的个数为5
b数组的个数为5
datas[]的大小为8
10 24 39 45 95
datas[]的大小为8
10 24 39 45 95
乱七八糟的概念
笔试前扫题目
1 费布那切数组
2 冒泡法
3 选择排序法
指针
1 变量的访问有两种方式:变量名 地址
2 &: 取地址 ,取变量名所代表的变量的内存地址
int a = 10;
&a (0x660cffC0)
3.* : 此时 * 代表的是一个运算符,跟±*/运算符类似,该运算符的功能是 取出内存地址中数据的值(取内容)
4 指针 = 地址
5 变量
整型变量 存放的是整数 int a; a=10
字符变量 存放的是字符 char c; c=‘A’
指针变量存放的是地址
int* p; p=&a
char *p; p=&c
*p = &a 错误的
*只有在定义一个指针变量的时候,才是指针的标识符,其他情况,都是一个运算符, 此时代表的是一个运算符,跟±/运算符类似,该运算符的功能是 取出内存地址中数据的值(取内容)
6.使用
1 指针分类型
2 指针++根据类型不同,偏移值也不同
3 指针和数组
数组 首地址
数组名 int array[10], int *p, p=array
第一个元素的地址 int array[10], int *p, p=&array[0]
注意指针偏移的位置,不要超出了数组 看到乱码
#include <stdio.h>
int main()
{
int a=1;
char c = 'a';
int *p1;
p1 =&a;
char* p2 = &c;
printf("a=%d\n",*p1);
printf("c=%c\n",*p2);
printf("a的地址%p\n",p1);
printf("a++的地址%p\n",++p1);
printf("c的地址%p\n",p2);
printf("c++的地址%p\n",++p2);
int b[3] = {1,2,3};
printf("第一个元素的地址%p\n",&b[0]);
printf("第二个元素的地址%p\n",&b[1]);
printf("第三个元素的地址%p\n",&b[2]);
int i;
for(i=0;i<3;i++){
printf("%d ",b[i]);
}
putchar('\n');
int *p;
p = &b[0];
printf("第一个元素的地址%p\n",p++);
printf("第二个元素的地址%p\n",p++);
printf("第三个元素的地址%p\n",p);
p = &b[0];
for(i=0;i<3;i++){
printf("%d ",p[i]);
}
putchar('\n');
return 0;
}
7.为什么要用指针
1 指哪打哪
给内存的指定位置赋值volatile int *p = (volatile int *)0x0060ff00;
2 经典数据交换 参数传递要用地址
#include <stdio.h>
void swap1(int a,int b)
{
int tmp;
tmp = a;
a = b;
b = tmp;
}
void swap2(int* a,int* b)
{
int tmp;
tmp =*a;
*a = *b;
*b = tmp;
}
int main()
{
volatile int *p = (volatile int *)0x0060ff00;
printf("p adress is %p\n",p);
int data1 = 10;
int data2 = 5;
//swap1(data1,data2);
swap2(&data1,&data2);
printf("data1=%d\n",data1);
printf("data2=%d\n",data2);
return 0;
}
8 指针数组 指针的数组 好多指针放在一起是一个数组,数组的每一个元素是指针
白话:好多变量的地址的集合
int *p[5];
9. 数组指针 一个指针变量 真正指向某个类型数组的指针 以前我们的指针是指向数组的头
此指针明确规定了要指向数组的类型及大小
int (*p)[5];
#include <stdio.h>
#include <stdlib.h>
int main()
{
int a[3] = {1,2,3};
int (*p)[3]; //数组指针的定义方式
p = &a; // 整个数组的地址
int *p2; //普通指针
p2 = a; // 数组第一个数的地址
printf("address:%p\n",p);
printf("address:%p\n",++p);
printf("address:%p\n",p2);
printf("address:%p\n",++p2);
return 0;
}
- 函数指针
一个指针变量 存放的是函数的地址
如何定义 int (*p2)(int a,int b) void (*p)()
如何通过指针来调用函数 (*p2)(1,2) p()
#include <stdio.h>
#include <stdlib.h>
void printfWelcome()
{
printf("********************\n");
}
int add(int a,int b)
{
return a+b;
}
int main()
{
void (*p)();
p = printfWelcome;
p();//直接通过函数指针调用
(*p)();//取内容
int (*p2)(int a,int b);
p2 = add;
int ret = (*p2)(1,2);
printf("%d\n",ret);
return 0;
}
11.无类型的指针
一个指针变量 不知道指向的空间是什么属性
#include <stdio.h>
#include <stdlib.h>
int main()
{
int n = 5;
int a[n];
int *p = (int *)malloc(n * sizeof(int));
int i;
for(i=0;i<n;i++){
printf("input:");
scanf("%d",&a[i]);
}
printf("%d",a[3]);
return 0;
}
用函数 数组 指针 实现学生成绩管理(仅分数)
#include <stdio.h>
#include <stdlib.h>
void inputScores(int *scores,int cnt)
{
int i;
for(i=0;i<cnt;i++){
printf("请输入第%d个人的成绩\n",i+1);
scanf("%d",scores);
if(*scores<0 || *scores>100){
printf("sb\n");
exit(-1);
}
scores++;
}
}
int getMax(int *scores,int cnt)
{
int max = 0;
int i;
for(i=0;i<cnt;i++){
if(max < *scores){
max = *scores;
}
scores++;
}
return max;
}
int getMin(int *scores,int cnt)
{
int min = 100;
int i;
for(i=0;i<cnt;i++){
if(min > *scores){
min = *scores;
}
scores++;
}
return min;
}
float getAvg(int *scores,int cnt)
{
int i;
int total;
float avg;
for(i=0;i<cnt;i++){
total = total + *scores;
scores++;
}
avg = (float)total/i;
return avg;
}
void print(int max,int min,float avg)
{
printf("max:%d\n",max);
printf("min:%d\n",min);
printf("avg:%.2f\n",avg);
}
int ranshu()
{
int n;
printf("输入学生个数:\n");
scanf("%d",&n);
return n;
}
int main()
{
int n = ranshu();
int *scores = (int *)malloc(n * sizeof(int));
int i;
int min;
int max;
float avg;
int *p;
p = scores;
inputScores(scores,n);
max = getMax(scores,n);
min = getMin(scores,n);
avg = getAvg(scores,n);
print(max,min,avg);
return 0;
}