黑马程序员-IOS-C语言基础-复杂数据类型

数组

-------------------------------------- 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培训期待与您交流! ---------------------------------


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值