自学嵌入式 day 15-c语言-第10章 指针

10 用指针来处理字符串

        "hello whorld" ---为匿名数组,值为表示数组首元素地址

(1)可定义:char *p = "hello world",表示p的值是首元素地址。

(2)定义后不可被赋值:*p = 'A',编译无问题,运行系统崩溃。字符串常量在字符串常量区,不可修改。

11 const 关键字

(1)const int i:i不可被赋值。

(2)const int *p :则p不可使用间接访问改变指针指向的变量。

(3)根据功能使用,能加就加。

算法:

(1)计算字符串长度

int Strlen(char *s)
{
    int counter = 0;
    while(*s)
    {
        ++counter;
        ++s;
    }
    return counter;
}

(2)字符串拷贝

void Strcpy(char *dest,const char *src)
{
    while(*src)
    {
        *dest = *src;
        ++dest;
        ++src;
    }
    *dest = *src;
}

(3)字符串连接

char *Strcat(char *dest,const char *src)
{
    char *ret = dest;
    while(*dest)
    {
        ++dest;
    }
    while(*src)
    {
        *dest++ = *src++;
    }
    *dest = '\0';
    return ret;
}

(4)从第n个元素开始拷贝

char *Strncpy(char *dest,const char *src,int n)
{
    char *ret = dest;
    while(*src && n > 0)
    {
        *dest++ = *src++;
        --n;
    }
    *dest = 0;
    return ret;
}

(5)从第n个元素开始比较

int Strncmp(const char *s1,const char *s2,int n)
{
    while(*s1 == *s2 && *s1 && *s2 && --n)
    {
        ++s1;
        ++s2;
    }
    return *s1 - *s2;
}

12 void * -----万能指针

(1)可以接受任何类型的地址。

(2)不能进行指针运算。

(3)用时需要强制类型转换,在设计函数时无法确定数据类型时使用。

算法:内存拷贝

void *Memcpy(void *dest, const void *src, int n)
{
void *ret = dest;
char *p = (char *)dest;
char *q = (char *)src;
while(n--)
{
*p++ = *q++;
}
return ret;
}

       注:参数类型可任意设置

13 数组指针

      概念:  指向数组的指针。

        int a[100]

①a:数组首元素地址。

②&a:整个数组的地址。

(1)定义:

int (*p)[10];

①p--表示指向长度为10的一维数组的指针。

②p基类型为int (*)[10]。

注:a[1][1] <=> *(*(a + 1) + 1)

算法:

(1)求极值

int maxOfarray2D(int (*a)[4],int rows)
{
    int cols = sizeof(*a) / sizeof(**a);
    int i,j;
    int max = **a;
    for(i = 0;i < rows;++i)
    {
        for(j = 0;j < cols;++j)
        {
            if(*(*(a +i) + j) > max)
            {
                max = *(*(a + i) + j);
            }
        }
    }
    return max;
}

练习:

1、编写程序在一个字符串中查找某个字串首次出现的位置, int subString(const char ts, const ch ar *sub);

#include<stdio.h>

#include<string.h>

int findSub(const char *s,const char *sub)
{
    int a = strlen(s) - strlen(sub);
    int i;
    int b = strlen(sub);
    for(i = 0;i <= a;++i)
    {
        if(strncmp(s + i,sub,b) == 0)
        {
            return i;
        }
    }
    return -1;
}

int main(void)
{
    char s[100] = "hello china";
    char sub[100] = "lo";
    int a = findSub(s,sub);
    if(a >= 0)
    {
        printf("found,%d\n",a);
    }
    else
    {
        puts("no found");
    }
    return 0;
}

2、用指向数组的指针作为函数的参数,编写程序计算某二维数组所有边上元素的和。

#include<stdio.h>

int addArray2D(int (*a)[4],int rows)
{
    
    int cols = sizeof(*a) / sizeof(**a);
    int i,j;
    int sum = 0;
    for(i = 0;i < rows;++i)
    {
        for(j = 0;j < cols;++j)
        {
            if (i == 0 || j == 0 || i == rows - 1 || j == cols - 1)
            {
                sum += *(*(a + i) + j);
            }
        }
    }
    return sum;
}

int main(void)
{
    int a[3][4] = {1,2,3,4,5,6,7,8,9,10,11,12};
    int rows = sizeof(a) / sizeof(a[0]);
    int sum = addArray2D(a,rows);
    printf("%d\n",sum);
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值