A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始



指针的运算:

    指针和整数进行运算

        公式:指针 + n = 指针保存的地址 + n * sizeof(指针指向的类型)

             指针 - n = 指针保存的地址 - n * sizeof(指针指向的类型)

    注意:指针和整数的运算,只能做加减,不能做其他的


    指针和指针的运算:
        只能做减法运算!

            算出他们相差几个数据位(元素位)

                1000 0000 0000 0000


  第一位叫符号位:如果有1代表是负数

但是如果你用unsigned类型来存储上面这段二进制的话

        注意:如果得到的是负数,那么证明被减数在减数的前面(低位)



字符串:
        它是一串字符序列,以'\0'结尾

        '\0'其实就是0


字符串两种表示法:
        1.数组表示法:
                char 字符串名[] = "字符串";

        2.指针表示法:
                char *字符串名 = "字符串";


他们两种的区别:
        1.字符串实际存储的位置不同:
                    数组表示法的字符串存在栈

                    指针表示法的字符串存在常量区


        2.开辟的空间个数不同:
                    数组表示法只开辟一个空间,开辟在栈区(局部变量)

                    指针表示法开辟两个空间,一个在常量区,一个在栈区(局部变量)
                            栈区保存字符串的地址,常量区才保存字符串

        3.字符串可变与不可变的区别:
                    数组表示法可以修改字符串内容
                    指针表示法不能修改字符串内容(常量不可变)

        4.可否接收用户输入的区别
                    数组表示法可以接收用户输入
                    指针表示法不能接收用户输入(常量不可变)


    如果要输出字符串:
        用printf搭配%s,那么系统会自动输出字符一直遇到\0则结束输出

        还可以用puts(字符串);
   
        puts和printf的区别:puts自带换行,puts只能输出字符串


    如果要输入字符串:
        用scanf搭配%s

        gets(字符数组);

        scanf和gets的区别:scanf不能接收到空格,默认把空格当做字符串结束了,gets可以接收空格,不会当字符串结束了



    字符串常用的函数:

        1.先导入string.h

        1.strcmp:
                strcmp(字符串1,字符串2);

            作用:比较两个字符串是否相等,相等返回0,否则非0
   
            详细来说:问字符串1比字符串2大吗?如果大,返回正数,如果小返回负数,如果相等返回0


        2.strcat:
                strcat(字符数组,字符串2);

            作用:把字符串2添加到字符数组的后面

            注意:字符数组的长度必须足够长


        3.strcpy:
                strcpy(字符数组,字符串2);

            作用:将字符串2复制给字符数组,会覆盖字符数组原来的内容
                 其实就是给字符数组重新赋值

            注意:字符数组的长度必须足够长


        4.strlen:
                strlen(字符串);

            作用:计算字符串的实际个数(不包括\0)

            原理:遍历字符串,每遍历一个字符,个数+1,直到\0则结束

*/

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

int main(int argc, const char * argv[]) {
   
    /*
    int num = 10;
   
    int *p = &num;
   
    printf("%p\n",p);//0x7fff5fbff77c
   
    printf("%p\n",p+1);//0x7fff5fbff780
   
    printf("%p\n",p-1);//0x7fff5fbff7
    */
   
    /*
    int nums[] = {10,11,12,13,14};
   
    int *p1 = &nums[0],*p2=&nums[3];
   
    printf("%ld\n",p1-p2);//-3 %lu unsigned long 只能放正数
    */

    //指针与整数的运算遍历数组
    /*
    int nums[] = {1,2,3,4,5};
   
    int len = sizeof(nums) / sizeof(int);
   
//    int *p = &nums[0];
//   
//    for (int i=0; i<len; i++) {
//        
//        printf("%d  ",*(p+i));
//    }
   
    //指针自增进行循环
//    int *p = &nums[0];
//   
//    for (int i=0; i<len; i++) {
//        
//        printf("%d  ",*(p++));
//    }
//
    //上面和下面是一个意思
//    for (int i=0; i<len; i++) {
//        
//        printf("%d  ",*p);
//   
//        p++;//p = p+1;
//    }

//    int *p = &nums[len-1];
//   
//    for (int i=0; i<len; i++) {
//        
//        printf("%d  ",*(p-i));
//    }
   
    int *p = &nums[len-1];
   
//    for (int i=0; i<len; i++) {
//        
//        printf("%d  ",*p);
//        
//        p--;
//    }
   
    //上面下面一样
   
    for (int i=0; i<len; i++) {
        
        printf("%d  ",*(p--));
        
    }
    */
   
    //字符串的输入和输出
    /*
    char str1[10] = "abc\0edc";
   
    //scanf("%s",str1);//数组名本身就是地址了,所以不用加&,但是加了也不会报错,也可以正常使用
   
    gets(str1);
   
   
    puts(str1);
   
//    printf("%s\n",str1);//abc
//   
//    puts(str1);
//   
//    char *str2 = "abc";
   
//    str1[1] = 'z';
//   
//    puts(str1);
   
    //str2[1] = 'z';//运行时报错
    */
   
    //strcmp
    /*
    int res = strcmp("zbc", "bbc");
   
    printf("%d\n",res);//正数
    */
   
    //strcat
    /*
    char str[50] = "哈哈";//这个可以
     //char *str = "哈哈"; strcat的第一个参数不可以用指针表示法
   
    char str2[] = ",你们也很帅";
    strcat(str, str2);
   
    puts(str);//
    */
   
    //strcpy
    /*
    char str[50] = "abc";
   
    strcpy(str, "qwe");//注意第一个参数不能用指针表示法,只能用数组表示法
   
    puts(str);//qwe
    */
   
    //strlen
    /*
    char str[4] = "abc";
   
    printf("%lu\n",strlen(str));//3
   
//    char str[] = "abc\0aaa";
//    printf("%lu\n",strlen(str));//3
   
//    char str[] = "abc\naaa";
//    printf("%lu\n",strlen(str));//7
   
   
//    char str[] = "abc哈";
//    printf("%lu\n",strlen(str));//6个,因为一个中文占3个字节
   
//    char str[] = "abc哈,";
//    printf("%lu\n",strlen(str));//9个,因为一个中文占3个字节,中文符号也是3个字节
   
    char *str = "abc哈";
    printf("%lu\n",strlen(str));//6个,任意形式的字符串都可以传给strlen
    */
   
    return 0;
}

2 个回复

倒序浏览
好辛苦!
回复 使用道具 举报
整理不容易,帮忙支持一下~~~
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马