美文网首页
指针的练习

指针的练习

作者: 一__谷__作气 | 来源:发表于2019-08-28 15:36 被阅读0次

    此代码是在Xcode的Single View App 中的main函数中写的,类似于OC的字符串切割函数

    #import <UIKit/UIKit.h>
    #import "AppDelegate.h"
    #define __SYMBOL_VISIBILITY__(type) __attribute__((visibility("hidden"))) type
    
    __SYMBOL_VISIBILITY__(size_t) sys_strlen( const char *_str){
        const char *eos = _str;
        while(*eos++);  /* find `\0` in _str*/
        return(eos-_str-1);
    }//此函数计算字符串的长度
    
    __SYMBOL_VISIBILITY__(void) *sys_memcpy(void *dst,const void *src,size_t num){
        
        if (dst == NULL || src == NULL) {
            return dst;
        }
        
        //assert(des>=src+num||src>dst+num);
        Byte * psrc = (Byte *)src;//byte 既为unsigned char类型
        Byte * pdst = (Byte *)dst;
        
        while(num-- > 0)
            *pdst++ = *psrc++;
        
        return dst;
    }//替代系统的memcpy
    
    int main(int argc, char * argv[]) {
        @autoreleasepool {
            
            char aaa[128]= {"avbv"};
            char * bbb = aaa;
    //aaa 是一个变量 代表字符串 “avbv”,bbb是aaa的指针,但是代表的是字符串的首个元素的地址,查看输出即可
            printf("%s--%p---%p--%c\n",aaa,&aaa,bbb,*bbb);
            //输出: avbv--0x16fd4f978---0x16fd4f978--a
            
            for (int i = 0; i<4; i++) {
                if (i==2) {
                    printf("%s--%p---%p--%c\n",aaa,&aaa,bbb,*bbb);
                    //输出: avbv--0x16fd4f978---0x16fd4f97a--b
                    *bbb = 0;
                    printf("%s--%p---%p--%c\n",aaa,&aaa,bbb,*bbb);
                    //输出: av--0x16fd4f978---0x16fd4f97a—(NULL)
                }
                bbb++;//每次bbb+1,也就是bbb指向的位置都会向后挪一位
            }
            //在这个循环中,在这里我们取第三位字符,当执行到i=2时,我们再看输出,我们看输出,会发现aaa变化了avbv—>av
            //为什么 在给*bbb=0重新赋值之后,aaa也改变了呢???
            //因为字符串的结尾是0,字符串是以0结尾的,原本aaa是avbv,bbb在i=2时指向字符"b”,但是在此处,*bbb=0,将0直接赋值给了bbb指向的位置,那么aaa原本是一个avbv,就改为av0v,字符串以0结尾,那么系统就把aaa变为’av’.
    
    //以上是简单的小例子,看懂上述demo之后,在看下面的
            
            
            size_t _cl = sys_strlen("羌内恕己以量人兮$惟草木之零落兮:$className$methodName$惟庚寅吾以降$众女嫉余之蛾眉兮”);//获取字符串长度
            
            
            char clm[256]={0};
            char *_clm_ptr = clm;
            
    
            char *_real_class_name = NULL;
            char *_real_m_name = NULL;
            int _mynum = 0;
            
            sys_memcpy(clm, "羌内恕己以量人兮$惟草木之零落兮:$className$methodName$惟庚寅吾以降$众女嫉余之蛾眉兮", _cl);//给clm赋值
            
            //在下面的循环中,clm相当于上述demo中的aaa,_clm_ptr相当于demo中的bbb;
            //遍历整个字符串,得到每个字符
            for(int i=0;i<_cl;i++){
                //判断每个字符,当字符是$时,进入下层
                if(*_clm_ptr == '$’){
                    //当指针指向$时,将指针指向的值改为0,那么整个clm,就变化了,(可以手动调试一下)
                    *_clm_ptr = 0;
                    _mynum++;
                    if(_mynum == 2){
                        printf("_clm_ptr:%p---value:%c\n",_clm_ptr+1,*(_clm_ptr+1));
                        _real_class_name = _clm_ptr + 1;
                        //此处也是一大特点,当_mynum=2时,给_real_class_name赋值,_real_class_name也是一个指针,首次运行到这里时,_real_class_name的值是“className$methodName$惟庚寅吾以降$众女嫉余之蛾眉兮”,但是当程序执行到下一个$时,_clm_ptr再次被重新赋值为0,也就是变为了“className0methodName$惟庚寅吾以降$众女嫉余之蛾眉兮”,那么_real_class_name也会变化为“className”(被系统由0切割)
                    }else if (_mynum == 3){
                        printf("_clm_ptr:%p---value:%c\n",_clm_ptr+1,*(_clm_ptr+1));
                        _real_m_name = _clm_ptr +1;
                        //同上所述,_real_m_name 变为了methodName
                    }else if (_mynum == 4){
                        break;
                    }
                }
                _clm_ptr++;//每次循环,都会+1,和demo类似,指针向后挪一位
            }
            printf("_realClass_name:%s---_real_M_name:%s\n",_real_class_name,_real_m_name);
            //输出:_real_M_name = className  _real_M_name = methodName.
            return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
        }
    }
    
    

    相关文章

      网友评论

          本文标题:指针的练习

          本文链接:https://www.haomeiwen.com/subject/tnfmectx.html