【指针和字符串】

一.一级指针

三级指针只能关联二级指针地址,二级指针只能关联一级指针地址,一级指针只能关联变量地址
int main()
{
    int a = 10;
    int b = 20;
     int* p = &a;
    *p = 100;
    p = &b;
    *p = 200;
    int** pp = &p;
    **pp = 1000;
    *pp = &a;
   **pp = 2000;}

二.指针和数组的关系


数组名+整型:
arr :数组首元素地址
数组名+1  ->  加单元格(类型有关)
例如:(1)*(arr+1)  <=>  arr[1]
           (2)*arr  <=> arr[0]

数组和指针关系:(p+i) <==>&p[i]
       const char *str="hello";
       *(str+i)='z';//error
       *(str+i) -> str[i]

三.指针和const结合

1.指针和const 的使用
const 放在* 前 :可以指向a但不能修改a
 1)
 int a=10;
 int b=20;
 const int* p = &a; // int const *p = &a
 *p=100;//error
 *p=&b;//right
 *p=200;//error
2)
const 放在* 后 
 int a=10;
 int b=20;
 int* const p = &a; (修饰的是p本身)
         ->修饰的是指针变量本身。一经指向a,不能指向其他地址。没有限定a本身的值是否被修改。
 p=&b;//error
 *p=100;//right
 3)
 const int a=10;
 int *p = &a;//error   *p=10;//error
 const int *p=&a;//right (p修饰的a是一个常量)
 4)
 const int* const p=&a;//p指向a,不能指向其他变量,p不能修改a的值

四.字符串的定义及特点
* 字符串:定义
* 1)char ch[]="hello"; 数组大小5+1 ‘\0'
* 2)char *p="hello";//error
*   const char* str="hello";//right
* 字符串1="hello"    字符串2="world"  关系
* 1)字符串拷贝
* 2)字符串拼接操作
* 3)字符串比较操作:strcmp
* 字符串操作  char *p = "hello";
*    字符串定义,求字符串长度
*    字符串比较  strcmp
*     字符串拷贝   strcpy
*    字符串拼接   strcat 
* 4)字符串"123" -> 整型123  "-123" -> -123  "+-+----123" -> -123
*   atoi操作
* 5)itoa   整型:123  -> "123"

字符串基本认识
int main()
{
    char ch[] = { 'h','e','l','l','o' };//5
    char arr[] = "he\0llo";//7
    int len_ch = sizeof(ch)/ sizeof(ch[0]);
    int len_arr = sizeof(arr) / sizeof(arr[0]);

    int len_string = strlen(arr);//第一个'\0'前面数据 //2 //(strlen)
    printf("ch:%d   arr:%d  字符串长度:%d", len_ch, len_arr, len_string);
    return 0;
 }

1>字符串比较  strcmp

方法1:
int my_strcmp(const char* str1, const char* str2)
{
    assert(str1 != NULL && str2 != NULL);
    int len = strlen(str1);
    for (int i = 0; i < len; i++)
    {
        if (str1[i] == str2[i])
        {
            continue;
        }
        else if (str1[i] > str2[i])
        {
            return 1;
        }
        else
        {
            return -1;
        }
        return 0;
    }
    /*while (*str1!=*str2)
    {
        if (*str1 < *str2)
        {
            return 1;
        }
        else if (*str1 > *str2)
        {
            return -1;
        }
        else
        {
            return 0;
        }
    }*/
}

int main()
{
    const char* str1 = "abcde";
    const char* str2 = "abcde";
    int res = my_strcmp(str1, str2);
    printf("%d", res);
    return 0;
}


针对方法1的优化代码
int my_strcmp(const char* str1, const char* str2)
{
    assert(str1 != NULL && str2 != NULL);
    int result = 0;
    int len = strlen(str1);
    for (int i = 0; str1[i] != '\0' && str2[i] != '\0'; i++)
    {
        if (str1[i] > str2[i])
        {
            result = 1;
            break;
        }
        else if(str1[i] < str2[i])
        {
            result = -1;
            break;
        }
        return 0;
    }
}

方法2:指针形式操作
int my_strcmp(const char* str1, const char* str2)
{
    assert(str1 != NULL && str2 != NULL);
    while (*str1 == *str2)
    {
        str1++;
        str2++;
    }
    if (*str1 > *str2)
    {
        return 1;
    }
    else if (*str1 < *str2)
    {
        return -1; 
    }
    return 0;

}
2>字符串拼接   stract

char* my_strcat(char* str1, const char* str2)
{
    assert(str1 != NULL && str2 != NULL);
    int len = strlen(str1);
    //给str1连接str2数据
    int i=0;
    for (; i < strlen(str2); i++)
    {
        str1[len+i] = str2[i];
    }
    str1[len+i] = '\0';//字符串结尾标记‘\0‘
    return str1;
}

unsigned int my_strlen(const char* str)
{
    assert(str != NULL);
    unsigned int count = 0;
    while (*str != '\0')
    {
        count++;
        str++;
    }
    return count;
}

int main()
{
    const char* str1 = "abcde";
    const char* str2 = "abcde";
    char ch[10] = "abc";
    char *res = strcat(ch,"def");
    printf("%s", res);
    return 0;

}

3>字符串拷贝   strcpy
char* my_strcpy(char* str1, const char* str2)
{
    assert(str1 != NULL && str2 != NULL);
    //指针实现方式
    while (*str2 != '\0')
    {
        *str1 = *str2;
        str1++;
        str2++;
    }
    *str1 = '\0';
    return str1;
    //数组实现方式
    /*int len = strlen(str2);
    for (int i=0; i < strlen(str2); i++)
    {
        str1[i] = str2[i];
    }
    str1[len] = '\0';
    return str1;*/
}

int main()
{
    char str1[10] = "abc";
    const char* str2 = "defghi";
    char* res=my_strcpy(str1, str2);
    printf("%s", res);
}
 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值