C语言—字符串、指针


---字符串


1.字符串
"jack" == 'j' + 'a' + 'c' + 'k' + '\0'   用数组保存字符串
char name[10] = "jack";
printf(name);

2.字符串的一些定义
都是字符串(\0的ASCII码值是0)
char name[8] = "it";
char name2[8] = {'i','t','\0'};
char name3[8] = {'i','t','0'};(\0的ask码是0)
char name4[8] = {'i','t'};最好不要用此种方式写字符串

3.\0的作用
字符串结束的标记

4.常见错误
不算是一个字符串(只能说是一个字符数组)
char name5[] = {'i','t'};

5.输出方式
printf("%s",name); // 会从name这个地址开始输出字符,直到遇到\0为止

---strlen函数:计算字符串长度

1.strlen函数:计算字符串长度
 1>计算的是字符数,并不是字数。一个汉字算作3个字符
 2>计算的字符不包括\0
 3>从某个地址开始数字符的个数,直到遇到\0为止

2.strlen函数声明在string.h文件中

#include<string.h>
int main()
{     
    strlen("haha");

    char name2[] = {'0', '\0', '6'}; // 遇到'\0'就结束
    
    int size = strlen(name2);
    
    printf("%d\n", size);

    return 0;
}

3.程序员编写一个程序的优先级:可读性->性能->精简(重构)

4.字符串练习(其中包含4种字符串遍历方式)
/*
编写一个函数char_contains(char str[],char c),
 如果字符串str中包含字符c则返回数值1,否则返回数值0
*/

#include <string.h>
#include <stdio.h>

int char_contains(char str[], char c);

int main()
{
    //int result = char_contains("itc8ast", '8');
    
    char name[] = "itcast";
    
    int result = char_contains(name, 'o');
    
    printf("%d\n", result);
    return 0;
}

// "itc"  '7'
int char_contains(char str[], char c)
{
    int i = -1;
    
    /*
     i  3
     str[++i] 'c'
     c  '7'
     */
    
    // 1.遍历整个字符串
    while ( str[++i] != c && str[i] != '\0' ) ;
    
    //return str[i] == '\0' ? 0 : 1;
    return str[i] != '\0';
}

/*
int char_contains(char str[], char c)
{
    int i = -1;
    
    // 1.遍历整个字符串
    while ( str[++i] )
    {
        // 如果发现某个字符等于参数c,直接返回1,退出函数
        if (str[i] == c)
        {
            return 1;
        }
    }
    
    // 2.说明str里面不包含字符c
    return 0;
}*/

/*
int char_contains(char str[], char c)
{
    int i = 0;
    
    // 1.遍历整个字符串
    while ( str[i] != '\0' )
    {
        // 如果发现某个字符等于参数c,直接返回1,退出函数
        if (str[i] == c)
        {
            return 1;
        }        
        i++;
    }
    
    // 2.说明str里面不包含字符c
    return 0;
}*/

/*
int char_contains(char str[], char c)
{
    // 1.遍历整个字符串
    for (int i = 0; i<strlen(str); i++)
    {
        // 如果发现某个字符等于参数c,直接返回1,退出函数
        if ( str[i] == c )
        {
            return 1;
        }
    }
    
    // 2.说明str里面不包含字符c
    return 0;
}*/

5.字符串数组

    char name[] = "jack";
    
    char name1[] = "rose";
    
    char name2[] = "jim";
    
    char name3[] = "jake";
    
    char names[2][10]= {"jack", "rose"};
    
    //printf("%s\n", names[0]);
    
    //printf("%c\n", names[0][3]);
    
    char names2[2][10] =
    {
        {'j', 'a', 'c', 'k', '\0'},
        {'r', 'o', 's', 't', '\0'}

    };


---指针(任何指针都占用8个字节的存储空间)

一、 指针的定义与赋值
       格式:变量类型 * 变量名
1、 先定义后赋值:
int a = 10;
int *p;
p = &a;
2、 定义的同时赋值:
int a = 10;
int *p = &a;
注意:int *p;   p = 10;  //p指向的地址是10
int *p;   *p = 100;  //p指向的地址里面的数据是100
int *p;   *p = &a;  //p指向的地址里面的数据是a的地址
%p输出指针里面存储的地址值。
不能乱用,比如:int a = 10;    float *p = &a;
指针的唯一作用:存储地址,访问对应的存储空间:取值或复值。

二、 指针变量所占用的存储空间
不管指针指向什么类型的数据,它存储的都是内存地址。所以所有的指针变量所占的空间都是一样的,与指针变量的类型无关,只跟编译器有关。在Xcode中,指针变量占8个字节(因为内存地址都是很大的数字)。

三、 为何指针变量要分类型
1、指针可以用于指向任何类型的变量(数组、结构体、其他指针等),这就需要定义不同类型的指针。如果指针没有指向相应类型的变量,那么运算结果就很有可能是错的。
2、在数组中经常会使用*(p+i)这种形式,指针可以和数字相加,指针的类型决定了当指针+1时跳过多少个字节。当为int类型时,就会跳过四个字节;当为char类型时,就会跳过一个字节。

四、 为什么要使用指针
1、 在函数调用时使用指针,可以让形参复制实参的地址,从而在函数内部修改外部变量的值。
2、 指针可以让函数返回多个值。

五、 指针与函数
1、 数组元素的访问方式
1> ages[i]  //数组名[下标]
2> p[i]   //指针变量名[下标]
3> *(p + i)  //指针加上一个数值
2、 数组指针和函数参数
      1)用函数操作一个数组,可以使用数组作为函数参数,也可以使用数组指针作为函数参数。调用时,实参都是数组名,因为数组名就是数组首元素的地址。
注意:两种方式中函数参数的本质都是一个指针,所以如果在函数内部使用sizeof(数组名),获得的总是8个字节(即指针的大小),而不是整个数组所占的字节数。

六、 指针与字符串
1、 字符串的定义
1> 利用数组   char name[ ] = "itcast";
特点:这样定义的字符串其实是一个变量字符串,里面的字符是可以修改的。
2> 利用指针   char *name = "itcast";
特点:这样定义的字符串其实是一个常量字符串,里面的字符是不能修改的。
2、 字符指针数组
定义一个字符指针数组:
char *name[2] = {"jack","rose"};
其实用字符串数组也可实现上面的存储:
char name[2][10] = {"jack","rose"};

七、 返回指针的函数
指针也是C语言中的一种数据类型,因此一个函数的返回值肯定可以是指针类型的。
返回指针的函数的一般形式为:类型名 * 函数名(参数列表)。

八、 指向函数的指针
1、 为什么指针可以指向一个函数
函数作为一段程序,在内存中也要占据部分存储空间,它也有一个起始地址,即函数的入口地址。函数有自己的地址,那就好办了,我们的指针变量就是用来存储地址的。因此,可以利用一个指针指向一个函数。其中,函数名就代表着函数的地址。
2、 指向函数的指针的定义
定义的一般形式:函数的返回值类型 (*指针变量名)(形参1, 形参2, ...);
3、 使用注意:
1> 由于这类指针变量存储的是一个函数的入口地址,所以对它们作加减运算(比如p++)是无意义的
2> 指向函数的指针变量主要有两个用途:调用函数,将函数作为参数在函数间传递。

---指针和数组

1.数组元素的访问方式
 int ages[5];
 int *p;
 p = ages;
 1> 数组名[下标]  ages[i]
 2> 指针变量名[下标] p[i]
 3> *(p + i)
 
2.指针变量+1,地址值究竟加多少,取决于指针的类型
  int *   4
  char *  1
  double * 8

int main {
       int ages[5] = {10,9,8,67,56];
       int *p;
     //指针变量p指向了数组的首元素
       p = &ages[0];
     //数组名就是数组的地址,也是数组首元素的地址
     //p = ages;
    /*
     p ----->&ages[0]
     p + 1---->&ages[1]
     p + 2------>&ages[2]
     p + i-------->&ages[i]  */
     //printf("%d\n",*(p + 2));
    for(int i;i<5;i++){
        printf("ages[%d] = %d\n",i,*(p + i));
         return 0;
   }
        
---指针和字符串

char *name = "it";//指针变量指向了字符串的首字母

1.内存的存储方式:
1>常量区  存放一些常量字符串
2>堆
3>栈      存放局部变量

2.定义字符串的2种方式
1>利用数组
char name[] = "fsfsaf";
特点:字符串里面的字符是可以修改的
使用场合:字符串的内容需要经常修改
2>利用指针
char *name = "faffsf";
特点:字符串其实是一个常量字符串,里面的字符是不能修改的
场合:字符串的内容不需要修改,而且这个字符串经常使用

指针数组(字符串数组)
char *name[5] = {"jack","rose","jake"};

3.指针和字符串练习
/*
 (不包括\0)
 编写一个int string_len(char *s),返回字符串s的字符长度
 */

#inclue<stdio.h>
int string_len(char *s);

int main()
{
    //char *name = "itcast";
    
   // 男 \u434\u4343\u434
    
    int size = string_len("tre777");
    
    printf("%d\n", size);
    return 0;
}

int string_len(char *s)
{
    // 1.定义一个新的指针变量指向首字符
    char *p = s;
    
    /*
    while ( *s != '\0' )
    {
        s++;
    }*/
    
    while ( *s++ ) ; 
    
    return s - p - 1;
}


/*
int string_len(char *s)
{
    // 记录字符的个数
    int count = 0;
    
    // 如果指针当前指向的字符不是'\0'
    // 首先*s取出指向的字符
    // 然后s++
    while ( *s++ )
    {
        // 个数+1
        count++;
        
        // 让指针指向下一个字符
        //s = s + 1;
        //s++;
    }
    
    return count;
}
*/

/*
int string_len(char *s)
{
    // 记录字符的个数
    int count = 0;
    
    // 如果指针当前指向的字符不是'\0'
    while ( *s != '\0')
    {
        // 个数+1
        count++;
        
        // 让指针指向下一个字符
        //s = s + 1;
        s++;
    }
    
    return count;
}*/

    





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值