-
C第五天
老师早上先给我们讲了昨天留的两道题,然后就开始给我们讲数组和指针,最后还涉及一点二维数组。每次到了指针这里总感觉头脑绕不过来,但是确实又是讲来讲去就那么点内容,感觉内容很少,就是消化特别慢。
"最近总能听到在“终端”下面不能粘贴复制,在这里我推荐试试ctrl+shift+c复制,ctrl+shift+v粘贴,反正我在虚拟机中可以这么用,实体机应该也可以"。
作业1.有一个袋子,里面有三种颜色的球,白:3 红:3 黑:6. 从中间取8只球,共有多少种方案
#include <stdio.h>
void main()
{
int i,j;
for(i=0;i<=3;i++)
for(j=0;j<=3;j++)
if(8-i-j<=6)
printf("红:%d 白:%d 黑:%d\n",i,j,8-i-j);
}
作业2.求输出和为一个给定整数的所有组合
如:4
0+4
1+3
2+2;
5
0+5
1+4
2+3
#include <stdio.h>
void main()
{
int data,i;
printf("请输入一个数:");
scanf("%d",&data);
for(i=0;i<=data/2;i++)
printf("%d+%d\n",i,data-i);
}
练习:有一个整型数组,含有10个元素,在整个数组中查找某一个值,找到了就给出这个值在数组中的位置,没有找到就输出"没有找到"
#include <stdio.h>
void main()
{
printf("请输入10个数:");
int i,a[10],search;
for(i=0;i<10;i++)
{
scanf("%d",&a[i]);
}
printf("请输入要找的值:");
scanf("%d",&search);
int flag=0;
for(i=0;i<10;i++)
{
if(search==a[i])
{
printf("%d\n",i+1);
flag++;
}
}
if(flag==0)
{
printf("没有找到!\n");
}
}
定义一个数组,里面升序排好了5个数,现在往其中插入某个数,使插入后的数组依然有序。
#include <stdio.h>
void main()
{
int a[6]={1,3,5,7,9,11},in,i,j;
printf("请输入要插入的数:");
scanf("%d",&in);
//1.找到要插入的位置
for(i=0;i<=4;i++)
{
if(a[i]>in)
break;//找到第一个比in大的元素结束循环,此时i即为in的下标号
}
//2.把原有数组中比插入的数大的元素往后挪一个位置
for(j=5;j>i;j--)//把插入点i之后的元素都往后挪一个位置
{
a[j]=a[j-1];
}
//3.把数插进入
a[i]=in;
for(i=0;i<6;i++)
printf("%d\n",a[i]);
}
#include <stdio.h>
void main()
{
int a=5;
// &a; //表示a所代表的空间的地址
printf("%d\n",*(&a));
*(&a)=3;//*,表示一个地址里面的值
printf("%d\n",a);
}
指针变量:用来接受内存中的地址。
指针:地址。
定义一个指针变量:
例:要定义一个指针变量,用来接受一个整型变量的地址
int a;//得到整型变量 &a 整型变量的地址
int *p=&a; //定义一个接受整型变量的地址的变量。指针变量。取名指针变量因为它保存的是一个变量的地址,只要找到了该指针变量就能找到那个变量,像一个指针时刻指向那个变量.
char c;
char *p=&c;//定义一个指向字符变量c的指针变量
整型变量数据类型:int
定义一个整型变量: int p; 用来接受一个整数: p=10;
小数变量数据类型:float
定义一个小数变量:float p;用来接受一个小数: p=1.2
字符变量的数据类型:char
定义一个字符变量:char p;用来接受一个字符:p='a'
指针变量数据类型:datatype*
定义一个接受整型变量的地址的指针变量:int *p; int a; p=&a;
定义一个接受小数变量的地址的指针变量:float* p;float a; p=&a;
定义一个接受字符变量的地址的指针变量:char* p;char a; p=&a;
int *p1,*p2;正确写法
int* p1,p2;错误写法
#include <stdio.h>
void main()
{
int a=5;
int *p=&a;
*p;
printf("*p=%d p=%p\n",*p,p);
}
#include <stdio.h>
void main()
{
int a[5]={1,2,3,4,5};
int *p;
/*
printf("a:%p &a[0]:%p\n",a,&a[0]);
printf("a+1:%p &a[0]+1:%p &a[1]:%p\n",a+1,&a[0]+1,&a[1]);
*/
printf("&a=%p a=%p &a+1=%p a+1=%p\n",&a,a,&a+1,a+1);
}
/*
1.a:表示数组的首元素的首地址。
a+1:表示数组第二个元素的地址,+1,跨过指针所指向对象的一个长度,此处a作为指针所指向的对象是数组中的元素。
%p:输出一个地址的格式
3.指针的含义包含2方面:1.它的值(地址)2.它指向的对象
2.&a:它的值是数组a的第一个元素的地址,但是作为一个指针,所指向的对象是整个数组,
&a+1:指针&a跨过一个&a所指向的对象,即从数组开头指向了数组最后,跨过整个数组
4.指向一个数组的指针p,加*,即为*p,变为指向该数组中的元素的指针,再加*,即为**p,变成了所指向的这个元素的值
*/
#include <stdio.h>
void main()
{
int a[5]={1,2,3,4,5};
int (*p)[5]=&a;
printf("%p\n",p);
}
/*
int a[5];//定义了一个int型的数组a,里面含有五个int型的元素
int *a[5];//定义了一个int*型的数组a,里面含有5个int*型的元素,指针数组——指针的数组
int (*a)[5];//定义了一个指向含有5个int型元素的数组的指针a.数组指针——数组的指针.
int *(*a)[5];//定义了一个指向含有5个int*型元素的数组的指针a.
*/
int a[5]={1,2,3,4,5};
a:1的地址
a+1:2的地址
&a:整个数组的地址==1的地址
&a+1:跳过该数组长度的地址
*a:1
*(a+1)=2
*&a<=>a
**&a<=>*a
int (*p)[3]=a
#include <stdio.h>
void main()
{
int a[5]={1,2,3,4,5};
int (*p)[3]=(int (*)[3])&a;
//左边:指针p指向含有3个int型元素的数组的指针
//右边:指针&a是一个指向含有5个int型元素的数组的指针,强制转换成指向一个含有3个int型元素的数组的指针。
printf("**p=%d,*p=%p,*p+1=%p,*(*p+1)=%d\n",**p,*p,*p+1,*(*p+1));
printf("**p=%d **(p+1)=%d\n",**p,**(p+1));
}
二维数组
定义一个二维数组:
datatype name[行数r][列数c];
例:int a[2][3];定义了一个二维数组,数组的名字为0;是一个2行3列的数组,数组中的每个元素都是int型
a[0][0]:第一行第一列的元素
a[1][1]:第二行第二列的元素
二维数组的行下标号从0开始到r-1结束,列下标号从0开始到c-1结束
二维数组在存储的时候是按行存储的,
二维数组的赋值:
1.初始化赋值:
2.先定义数组再赋值:
//求一个4行5列的整型数组的最大值,并输出他的行号和列号
#include<stdio.h>
int main()
{
printf("请输入一个4行5列的整型数组:");
int i,j,a[4][5],max = 0,c,d;
for(i = 0;i < 4;i++)
{
for(j = 0;j < 5;j++)
{
scanf("%d",&a[i][j]);
if(max < a[i][j])
{
max = a[i][j];
c=i;
d=j;
}
}
}
printf("max = %d %d %d\n",max,c,d);
}