美文网首页
指针的练习

指针的练习

作者: 一__谷__作气 | 来源:发表于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