c语言 数组 指针

数组

为什么需要数组 大量数据不关心数据名称的时候
数组的基本使用
数组定义: 类型 数组名 数组大小 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;
}

  1. 函数指针
    一个指针变量 存放的是函数的地址
    如何定义 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;
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值