黑马程序员技术交流社区

标题: C语言数组,字符串,函数与指针练习题. [打印本页]

作者: liuchuan_alex    时间: 2015-11-12 18:55
标题: C语言数组,字符串,函数与指针练习题.
C语言数组,数组与指针,字符串与指针,函数与指针练习题目,初学的小伙伴可以拿去练习,附带代码,有错误的地方请指教,本人也是新手初学第10天;{:2_32:}


/*
1.定义一个长度为5的int数组.分别用while与for遍历打印每一个值.(且每种都用两种方式:1.用数组名.2.用指针).
2. 定义一个函数可以把任意一个整型数组的最小值取出来
3. 定义一个函数可以把任意一个整型数组的平均值取出来
4.定义一个字符串数组,并打印里面的每一个字符串.
5.已知一个int数组 int arr[4]={2,4,3,6};问:*(arr+1)与*(&arr+1)的值一样吗?
6.分别用数组的指针与数组元素的指针去遍历打印5题中数组里面的每一个值.
7.把int arr[4]={65,66,67,68};转换成一个字符数组char arrChar[4];
8.定义一个函数,把任意一个大写字母转换成小写字母.注:大写与小写相差32.如'a'=97 'A'=65;
9.在控制台上输入整数,创建一个长度为3的int数组,用数组的每一个元素的指针组成一个int指针数组,并通过这个int指针数组求int数组的最小值.
10.已知int a=4; int *p=&a; int **ps=&p; int ***pss=&ps; 用指针pss把a的值改成100;
11.定义一个函数的指针,并使用.
12.定义一个指针型函数.
*/





1.定义一个长度为5的int数组.分别用while与for遍历打印每一个值.(且每种都用两种方式:1.用数组名.2.用指针).

// 1.定义一个长度为5的int数组.分别用while与for遍历打印每一个值.
// (且每种都用两种方式:1.用数组名.2.用指针).
#include <stdio.h>
int main(){
    //定义一个int数组,长度为5
    int arr[5]={2,6,1,8,10};
   
    //定义int型指针指向arr
    int *p=arr;
   
    //定义一个数组指针,指向数组st
   
    int (*parr)[5]=&arr;
   
    //定义一个整数用于while循环
    int num=0;
   
    //使用for循环遍历,各种形式
   
    //1.利用数组下标
    printf("\n\n第一次.使用for循环,利用数组下标进行遍历:\n");
    for (int i=0; i<5; i++) {
        printf("%d  ",arr[i]);
    }
    printf("\n\n");
   
    //2.利用指针加减对数组进行遍历
    printf("第二次.使用for循环,利用元素指针进行遍历:\n");
    for (int i=0; i<5; i++) {
        printf("%d  ",*(p+i));//其他方式 printf("%d  ",p[i]);
    }
    printf("\n\n");
   
    //3.利用数组指针进行遍历
    printf("第三次.使用for循环,利用数组指针进行遍历:\n");
    for (int i=0; i<5; i++) {
        printf("%d  ",(*parr)[i]);//其他方式printf("%d  ",*((int *)(&arr)+i));
    }
    printf("\n\n");
    //使用while循环进行遍历
   
    //4.利用普通数组下标进行元素遍历
    printf("第四次.使用while循环,利用数组下标进行遍历:\n");
    while (num<sizeof(arr)/sizeof(int)) {
        printf("%d  ",arr[num]);
        num++;
    }
    printf("\n\n");
   
    //5.利用元素指针进行元素遍历
    num=0;
    printf("第五次.使用while循环,利用指针进行遍历:\n");
    while (num<sizeof(arr)/sizeof(int)) {
        printf("%d  ",*(p+num));
        num++;
    }
    printf("\n\n");
   
    //5.利用数组指针进行元素遍历
    num=0;
    printf("第六次.使用while循环,利用数组指针进行遍历:\n");
    while (num<sizeof(arr)/sizeof(int)) {
        printf("%d  ",(*parr)[num]);
        num++;
    }
    printf("\n\n");
}
         

2.定义一个函数可以把任意一个整型数组的最小值取出来
//题目:
//2. 定义一个函数可以把任意一个整型数组的最小值取出来
#include <stdio.h>
int miniMum(int arr[6]);
void miniMum1(int *p1,int arr[6]);
int main(){
    //定义一个int型数组
    int arr[6]={6,2,8,10,13,66};
    printf("数组arr中元素为:\n");
    for (int i=0; i<6; i++) {
        printf("%d  ",arr[i]);
    }
   
    //定义一个数来接收最小值;
    int num;
    num=miniMum(arr);
    //打印最小值
    printf("\n普通方式--数组中最小数为:%d\n",num);
   
    //定义一个指针来接收最小值
    int *p=arr;
    miniMum1(p,arr);
   
    printf("指针方式--数组中最小数为:%d\n",*p);
   
    return 0;
}
//定义一个函数用来输出数组最小值,
int miniMum(int arr[6]){
   
    int num=arr[0];
    for (int i=0; i<6; i++) {
        num=num<arr[i]?num:arr[i];
    }
    return num;
}
//使用指针来找数组中最小值,无需返回值
void miniMum1(int *p1,int arr[6]){
   
     *p1=arr[0];
    for (int i=0; i<6; i++) {
        if(*p1>arr[i]) *p1=arr[i];
    }
   
}

3.定义一个函数可以把任意一个整型数组的平均值取出来
//3. 定义一个函数可以把任意一个整型数组的平均值取出来
#include <stdio.h>
double pingJun(int arr[6]);
void pingJun1(double *p1,int arr[6]);
int main(){
   
    //定义一个int型数组
    int arr[6]={6,2,8,10,13,66};
    printf("数组arr中元素为:\n");
    for (int i=0; i<6; i++) {
        printf("%d  ",arr[i]);
    }
   
    //定义一个数来接收平均值;
    double num=0;;
    num=pingJun(arr);
    //打印平均值
    printf("\n普通方式--数组平均值为:%.3f\n",num);
   
    //定义一个指针来接收平均值
    double num1=0;
    double *p=&num1;
    pingJun1(p,arr);
   
    printf("指针方式--数组中平均值为:%.3f\n",*p);
   
    return 0;
}
//1.定义一个函数用来输出数组平均值,
double pingJun(int arr[6]){
   
    double num=0;
    for (int i=0; i<6; i++) {
        num+=arr[i];
    }
    return num/6;
   
}
//2.使用指针来找数组中平均值,无需返回值
void pingJun1(double *p1,int arr[6]){
   
    for (int i=0; i<6; i++) {
        *p1+=arr[i];
    }
    *p1=*p1/6;
   
}

4.定义一个字符串数组,并打印里面的每一个字符串.
//题目:
//4.定义一个字符串数组,并打印里面的每一个字符串.
#include <stdio.h>
int main(){
    //定义一个字符串数组;
    char ch[3][20]={"liuchuan","hello,word~","heima,leihao"};
   
    //定义一个指针字符串数组
   
    char *ch1[5]={"liuchuan","hello,word~","heima,leihao"};
   
    //第一种方法,数组下标方法遍历字符串数组:
    printf("使用数组下标打印每个字符方法进行字符串打印:\n");
    for (int i=0; i<3; i++) {
        for (int j=0; j<20; j++) {
            printf("%c",ch[i][j]);
        }
        printf("\n");
    }
   
    //第二种方法,数组下标方法遍历字符串数组:for循环一次,%s打印
    printf("使用数组下标方法进行字符串打印二:使用%s打印\n");
        for (int j=0; j<3; j++) {
            printf("%s\n",ch[j]);
        }
   
   
    return 0;
}

5.已知一个int数组 int arr[4]={2,4,3,6};问:*(arr+1)与*(&arr+1)的值一样吗?

/*
*(arr+1)与*(&arr+1)的值不一样
*(arr+1),arr表示数组元素首地址,+1 加int个字节,地址加4个字节,指向数组第二个元素地址,值为4
*(&arr+1),&arr取的时整个数组的地址,&arr值和arr是一样的, &arr+1 是加16个字节,地址移动16个字节
*/

         



作者: liuchuan_alex    时间: 2015-11-12 18:57
6.分别用数组的指针与数组元素的指针去遍历打印5题中数组里面的每一个值.
#include <stdio.h>
int main (){
    int arr[4]={2,4,3,6};
   
    //定义一个数组指针
    int (*p)[4]=&arr;
    //定义一个数组元素指针
    int *p1=arr;
   
    for (int i=0; i<4; i++) {
        printf("%d ",(*p)[i]);//用数组指针遍历;
        printf("%d\n",*(p1+i));//用数组元素指针遍历;
    }
}

7.把int arr[4]={65,66,67,68};转换成一个字符数组char arrChar[4];
//题目
//7.把int arr[4]={65,66,67,68};转换成一个字符数组char arrChar[4];
#include <stdio.h>
int main(){
    //定义一个整形数组
    int arr[4]={65,66,67,68};
    //定义一个字符数组
    char arrChar[4];
    //第一种,使用数组下标进行转换,使用for循环
    for (int i=0; i<4; i++) {
        arrChar[i]=arr[i];
    }
   
    //1.字符数组进行打印输出
    for (int i=0; i<4; i++) {
        printf("%c ",arrChar[i]);
    }
    printf("\n");
    //2.使用%s,进行输出
    printf("使用%%s进行输出%s\n",arrChar);
   
    //第二种.使用数组元素指针进行转换
    int *p=arr;
    char *ch=arrChar;
   
    for (int i=0; i<4; i++) {
        *(ch+i)=*(p+i);
    }
    printf("\n使用数组元素指针进行输出:%s\n",ch);
   
    //使用数组指针进行转
   
    char (*ch1)[4]=&arrChar;
    int (*p1)[4]=&arr;
    for (int i=0; i<4; i++) {
        (*ch1)[i]=(*p1)[i];
    }
   printf("\n使用数组指针进行输出:%s\n",arrChar);
    return 0;
}

8.定义一个函数,把任意一个大写字母转换成小写字母.注:大写与小写相差32.如'a'=97 'A'=65;
//8.定义一个函数,把任意一个大写字母转换成小写字母.注:大写与小写相差32.如'a'=97 'A'=65;
#include <stdio.h>
//函数声明
void AAaa(char *p);
void aaAA(char *p);
int main(){
    //定义一个字符,用来接收用户输入的字符
    char ch=0;
    //定义一个指针,指向字符
    char *p=&ch;
    //提示用户输入
    printf("请输入一个英文字符,大小写都可以: ");
    //接收用户输入
    scanf("%c",&ch);
   
    //自动判断用户输入的是大些还是小写,如果输入大写则自动转小写,输入小写自动转大些,使用if语句
    if (ch<=96&&ch>=65) {
        AAaa(p);
        printf("\n转为小写为---->%c\n",*p);
    }else{
        aaAA(p);
        printf("\n转为大写为---->%c\n",*p);
    }
    printf("\n\n");
}
//大写转小写函数
void AAaa(char *p){
    *p+=32;
}
//小写转大写函数
void aaAA(char *p){
   
    *p-=32;
}

9.在控制台上输入整数,创建一个长度为3的int数组,用数组的每一个元素的指针组成一个int指针数组,并通过这个int指针数组求int数组的最小值.
//9.在控制台上输入整数,创建一个长度为3的int数组,用数组的每一个元素的指针组成一个int指针数组,并通过这个int指针数组求int数组的最小值.
#include <stdio.h>
int main(){
    //定义一个长度为3的int数组;
    int arr[3]={0};
    //定义一个数组元素指针,指向数组的首元素地址
    int *p=arr;
   
    //提示用户输入
    printf("请输入3个整数:\n");
    //接收用户输入,用数组元素指针接收用户输入数据
    for (int i=0; i<3; i++) {
         scanf("%d",p+i);
    }
   
    //定义一个指针数组,数组元素值arr元素指针
    int *parr[3]={p,(p+1),(p+2)};
   
    //通过指针数组*parr 求arr数组的最小值;
    //使用for循环求最小值,数据元素都和数组第一个数进行比较,不定义第三个变量;
    for (int i=1; i<3; i++) {
        if (*parr[0]>*parr[i]) {
            *parr[0]=*parr[i];
        }
    }
   
    //进行输入数组中最小数
    printf("您输入的最小值为:%d\n\n",*parr[0]);
    return 0;
   
}

10.已知int a=4; int *p=&a; int **ps=&p; int ***pss=&ps; 用指针pss把a的值改成100;
// 10.已知int a=4; int *p=&a; int **ps=&p; int ***pss=&ps; 用指针pss把a的值改成100;
#include <stdio.h>
int main(){
    //定义一个整形变量和多个多级指针,都指向a的地址
    int a=4;
    int *p=&a;
    int **ps=&p;
    int ***pss=&ps;
    printf("修改前a的值为:%d\n",a);
   
    //***pss,**ps,*p最终指向的地址都是a

    ***pss=100;
    printf("修改后a的值为:%d\n",a);
   
}

11.定义一个函数的指针,并使用.
// 11.定义一个函数的指针,并使用.
#include <stdio.h>
//函数声明
int add(int a,int b);
int llc(int (*p)(int a,int b));
int main(){
    //定义3个整形变量
    int num1=25;
    int num2=11;
    int num3=0;
    //定义一个函数指针
    int (*p)(int i,int y)=&add;
    //调用指针函数p
    num3=p(num1,num2);
    //打印num3的值:
    printf("num3=%d\n",num3);
   
    num3=llc(p);
   
    printf("num3=%d\n",num3);
   
}
//定义一个普通函数,参数a,b,返回a+b的值
int add(int a,int b){
    return a+b;
   
}
//定义一个函数,参数为一个函数指针
int llc(int (*p)(int a,int b)){
    //定义2个整型,用于接收用于输入的数字
    int a=0;
    int b=0;
    printf("请输入2个数字,用','号隔开: ");
    scanf("%d,%d",&a,&b);
   
    return p(a,b);
}




12.定义一个指针型函数.
#include <stdio.h>
//指针函数声明
int *add(int *p);
int main(){
    //指针函数.如:定义一个长度为5的整形数组,不使用主函数赋值,调用指针型函数进行赋值;
   
    //先定义一个长度为5的数组,默认值是0
    int arr[5]={0};
    //定义一个指针,指向数组首元素
    int *p=arr;
    p=add(arr);
   
    //将数组arr内的元素进行遍历
   
    printf("数组arr内的元素为:\n");
    for (int i=0; i<5; i++) {
        printf("%d\t",arr[i]);
    }
   
    printf("\n");
    return 0;
   
}
//定义指针函数型函数,add给数组arr赋值 参数也是一个指针*p,最后将p的地址返回
int *add(int *p){
    for (int i=0;i<5;i++) {
        scanf("%d",p+i);
    }
    return p;
}





作者: 蜗牛飞翔    时间: 2015-11-12 18:59
66666666,好流弊的样子
作者: 仰望星空的猪    时间: 2015-11-13 09:25
支持一下!
作者: normalwzh    时间: 2015-11-13 13:16
支持一下!
作者: springD    时间: 2015-11-13 14:26
能回复一下指针和数组的具体区别吗?谢谢
作者: 神陪我流浪    时间: 2015-11-13 21:33
支持一下!
作者: 心存猛虎2015    时间: 2015-11-13 22:02
顶起兄弟
作者: 能不能行    时间: 2015-11-13 22:15
6666666666666
作者: 唐阿丽    时间: 2015-11-14 14:25
支持一下!




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2