数组
-------------------------------------- android培训、java培训、ios培训期待与您交流! ---------------------------------
1,数组的基本概念及特点
数组就是用来存储一组数据的。
a,只能存放一种类型的数据,比如int类型的数组、float类型的数组。
b,里面存放的数据称为“元素”。
2,数组的定义
<1>,定义数组:声明数组的类型;声明数组的元素个数(需要多少存储空间)
<2>,格式:元素类型 数组名[元素个数] 例如:int arry[3]
<3>,数组的初始化:int arr[5] = {1,3,22,11,10}; int arr[] = {1,2,3,5,7,22};错误的初始化方式:int a[]; int[3]a; int a[b]; a[3] = {1};
a,元素有顺序之分,每个元素都有一个唯一的下标(索引),从0开始
b,访问数组的元素:arry[0] 代表访问的时数组arry的0下标对应的元素。
3,数组的使用
a,利用while和for循环对数组元素进行遍历(可以求出最值)
b,数组长度的计算:sizeof(数组名)/sizeof(数组类型) = 数组的长度
练习:
#include <stdio.h>
//设计一个函数:int arrayMax(int a[], int count),找出数组元素的最大值
int main()
{
//声明函数
int arrayMax();
//定义int类型的数组arr
int arr[] = {1,3,7,90,2,100};
//定义count记录数组arr的长度
int count = sizeof(arr)/sizeof(int);
//定义max记录数组的最大元素的值
int max = arrayMax(arr,sizeof(arr)/sizeof(int));
//打印出数组元素的最大值
printf("数组元素的最大值为:%d\n",max);
return 0;
}
int arrayMax(int a[], int count)
{
//定义max为默认数组的最大元素
int max = a[0];
//利用for循环对数组进行遍历
for (int i = 0; i < count; i ++) {
//判断元素值的大小
if (a[i] > max )
{
//将较大的值赋给max
max = a[i];
}
}
//返回数组元素的最大值
return max;
}
4,
二维数组
<1>,二维数组就是数组中的元素也是数组,它是一个特殊的一维数组:它的元素是一维数组。
<2>,二维数组的初始化
正确的初始化:int arr[3][4] = {1,3,9,2,6,8}; int arr[3][4] = {{1,2,3},{,3,2,1},{4,5,6}};
错误的初始化:int a[3][4]; a[3] = { };
<3>,二维数组元素的访问:int arr[3][4] = {1,3,9,2,6,8}; int arr[0][0] 位置上得元素的值为1
字符串
1,字符串的定义
由多个字符组合在一起就是字符串。
2,字符串的初始化
a,利用字符数组初始化:char a[] = "1234"; 和char a[] = {'1','2','3','4'}; 两者的区别是后者可以比较大小。
b,“1234”其实是由'1','2','3','4','\0'组成的,任何字符串都是以'\0'结尾的。字符串的输出是:"%s",'\0'是会输出的。
c,\0是字符串的结束标记。
3,常用字符串处理函数
strlen函数:计算字符串长度
<1>.计算的是字符数,并不是字数。一个汉字算作3个字符
<2>.计算的字符不包括\0
<3>.从某个地址开始数字符的个数,直到遇到\0为止
4,字符串数组:用来存储多个字符串的数组,也可以是多维数组。
练习:
#include <stdio.h>
#include <string.h>
//编写一个函数char_contains(char str[],char c),如果字符串str中包含字符c则返回数值1,否则返回数值0
int main()
{
//声明函数
int char_contains(char str[],char c);
//定义字符串数组str
char str[] = "itcast";
//定义int类型a记录返回值
int a = char_contains(str,'c');
//打印出返回值
printf("%d\n",a);
return 0;
}
int char_contains(char str[],char c)
{
//对字符串数组遍历
for (int i = 0; i < strlen(str); i ++)
{
//判断字符串str中是否包含字符‘c’
if (str[i]== c)
{
//包含返回1
return 1;
}
}
//不包含返回0
return 0;
}
1,指针变量
指针变量只能存储内存地址,它的作用:就是能够根据一个地址值,访问对应的存储空间。
<1>,定义格式:类名标识符 *指针变量名, int *p,指针变量p前面的int:指针变量p只能指向int类型的数据
<2>,指针的赋值:
a,先定义后赋值:int a = 10;int *p;p = &a;printf(“%d”,*p);取值。改值:*p = 9;
b,定义的同时赋值:int a = 10;int *p = &a;
<3>,利用指针可以实现修改函数的实参。
<4>,注意点:%p输出指针里面存储的地址值;指针未经初始化不要拿来间接访问其他存储空间;不能乱用类型,例如 int a = 10;float *p = &a;
<5>,清空指针:p = 0;或者p = NULL;
<6>,任何指针都占用8个字节的存储空间。
指针实例练习:
#include<stdio.h>
//void swap(char *a, char *b) (注意temp=a; a = b; b = temp;)
//声明swap函数
void swap(char *a, char *b);
int main()
{
//定义字符变量
char a = 'A';
char b = 'B';
//调用swap函数
swap(&a, &b);
//打印出结果
printf("a=%c, b=%c\n",a , b );
return 0;
}
void swap(char *a, char *b)
{
//交换两字符变量的内容
char temp = *a;
*a = *b ;
*b = temp;
}
#include <stdio.h>
//声明计算函数
int sumAndMinus(int a, int b, int *minus);
int main()
{
//定义int类型变量a和b并初始化
int a = 100;
int b = 90;
//定义int类型变量sum和minus分别存储和与差
int sum ,minus ;
//调用计算函数,并传入参数变量a,b,及minus的地址值
sum = sumAndMinus(a ,b ,&minus);
//打印出和与差
printf("和是:%d,差是:%d\n",sum ,minus);
return 0;
}
int sumAndMinus(int a, int b, int *minus)
{
//用指针指向两数差
*minus = a - b ;
//返回两数的和
return a + b ;
}
2,指针与数组
<1>.将数组当做函数参数传入时,会自动转为指针。
<2>,用指针遍历数组中的元素
#include <stdio.h>
void test1();
void test2();
int main()
{
//调用函数
test1();
test2();
return 0;
}
//利用指针遍历char类型的数组
void test1()
{
char arr2[] = "itcast";
//定义char类型的指针p2
char *p2;
//使指针p2指向数组arr2
p2 = arr2;
//获取数组长度
int c = sizeof(arr2)/sizeof(char);
for (int i = 0; i < c ; i ++) {
printf("%c",p2[i]);
}
printf("\n");
}
//利用指针遍历int类型的数组
void test2()
{
int arr[] = {1,2,3,5,8,4,12};
//定义int类型的指针p
int *p;
//使指针p指向数组arr
p = arr;
//获取数组长度
int c = sizeof(arr)/sizeof(int);
for (int i = 0; i < c ; i ++) {
printf("%d",p[i]);
}
printf("\n");
}
3,指针与字符串
1.常量区:存放一些常量字符串。 2.堆:对象。 3.栈:存放局部变量
<1>定义字符串的2种方式
1> 利用数组
char name[] = "itcast";
* 特点:字符串里面的字符是可以修改的
* 使用场合:字符串的内容需要经常修改
2> 利用指针
char *name = "itcast";
* 特点:字符串其实是一个常量字符串,里面的字符是不能修改
* 使用场合:字符串的内容不需要修改,而且这个字符串经常使用
<2>.定义字符串数组
1>利用二维字符数组
char names[2][10] = {"jack","rose"};
2>利用指针数组
char *names[2] = {"jack","rose"};
练习:
#include <stdio.h>
#include <string.h>
//编写一个int string_len(char *s),返回字符串s的字符长度
int main()
{
//声明int string_len(char *s)函数
int string_len(char *s);
//提示输入英文句子
printf("请输入英文句子:\n");
//定义字符数组存放输入的字符数据
char str[1024];
//定义指针指向字符数组
char *p = str;
//利用指针接收输入的字符串
scanf("%[^\n]",p);
//调用int string_len(char *s)函数
int a = string_len(p);
//打印出字符串长度
printf("字符的长度是:%d\n",a);
return 0;
}
//实现int string_len(char *s)函数
int string_len(char *s)
{
return (int)strlen(s);
}
4,返回指针的函数
<1>,指针也是C语言中的一种数据类型,因此一个函数的返回值也可以是指针类型的。
<2>返回指针的函数的一般格式为:类型名 *函数名(参数列表)
5,指向函数的指针
指向函数的指针就是用指针指向函数的入口地址。函数名就代表函数的地址。
定义的一般格式:函数的返回值类型 (*指针变量名)(形参1,形参2,……)
作用:1,调用函数。2,将函数作为参数在函数间传递。
// 定义指针变量指向sum函数
// 左边的int:指针变量p指向的函数返回int类型的数据
// 右边的(int, int):指针变量p指向的函数有2个int类型的形参
int (*p)(int, int);
p = sum;
void test1()
{
// (*p)是固定写法,代表指针变量p将来肯定是指向函数
// 左边的void:指针变量p指向的函数没有返回值
// 右边的():指针变量p指向的函数没有形参
void (*p)();
// 指针变量p指向了test函数
p = test;
p();
//(*p)(); // 利用指针变量间接调用函数
//test(); // 直接调用函数
}
-------------------------------------- android培训、java培训、ios培训期待与您交流! ---------------------------------