标签:style blog ar io color os 使用 sp for
1.指针与字符数组
<span style="font-size:14px;">     
    /**  定义字符串的2种方式
     *   1.利用数组
     *    char name[] = "itcast"
     *    *特点:字符串里面的字符是可以修改的
     *    *使用场合:字符串的内容需要经常修改.
     *   2.利用指针
     *    char *name = "itcast";
     *    *特点:字符串其实是一个常量字符串,里面的字符是不能修改的;
     *    *使用场合:字符串内容不需要修改,而且这个字符串经常使用.
     </span>
2.指针与字符串数组
<span style="font-size:14px;">   /** 定义字符串数组
     *  1.指针数组(字符串数组)
     *  char *name[] = {"jack", "rose"};
     *  2.二维字符数组(字符串数组)
     *  char name[2][10] = {"jack", "rose"};
     */
</span>3.返回指针的函数
<span style="font-size:14px;"> 
    char *test();//声明,(char *)
    char *test(){
        return "hehe";
    }
    char *name = test();
    printf("name = %s",name);
  
   </span>(*p)是固定写法,代表指针变量将来肯定指向函数.
左边的void:指针变量p指向的函数没有返回值.
右边():指针变量指向的函数没有参数.
<span style="font-size:14px;">    
 /*
    void test(){
        printf("xiaozhang");
    }
    
    void (*q)();
    p = test;//指针变量p指向了test函数
    (*p)();利用指针变量间接调用函数.//相当于test();直接调用函数.
    //或者用次方法 p(); //p = test;上面
 */
</span>例如:
<span style="font-size:14px;">    
    int sum(int a, int b);
    int (*q)(int, int);//int (*p)(int a,int b);定义了一个指向函数的sum的指针.
    q = sum;//将指针变量p,指向函数sum
    int c = (*q)(10, 11);//三种方式相同.
    // int c = q(10, 11);
    //int c = sum(10, 11);
    printf("%d \n",c);//21</span>
5.char *p[n] 与 char (*p)[n]的区别
<span style="font-size:14px;">    /*
    char str[6][10] = {};
    char (*p4)[10] = str;
    char *p5[10];
    printf("%lu \n",sizeof(*p4));//10
    printf("%lu \n",sizeof(p4));//8
    printf("%lu\n",sizeof(p5));//80
    printf("%lu",sizeof(*p5));//8
    */
     /*
    char str[6][10] = {};
    char (*p4)[10] = str; // *p4为char[10]型,相当于str[6].指针加一,将增加10个字节的长度:sizeof(*p4):10
    char *p4[10];//指针数组,有十个元素,每个元素指向char类型变量的指针
    sizeof(p4):10*8=80
     */
</span>6.实参到形参的传递,是一个拷贝的过程,传递有两种方式:
1.传值.传递的时变量中的内容.函数内部改变不会影响外部的变量.
2.传地址.传递的是变量的地址,函数内部改变会影响外部的变量.
例:两个数的最大值(传值) 两个数的和(传值) 给数组进行赋值(传地址)
7.p++与p + 1的区别
p++; 会改变p中存储的地址,指针重指向.
p + 1 不会改变p的地址.依然指向数组的首地址.
8.指针与结构体
<span style="font-size:14px;">   
    //指针与结构体的关系.
    Student stu = {"xiaozhang", 18, 60.0};
    printf("%s\n", stu.name);
    
    Student *p = &stu;
    //如何通过结构体指针变量访问结构体成员.
    //结构体指针变量->结构体指针
    printf("%s ,%.1f , %d\n", p->name, p->score, p->age);
    
</span>9.指针与结构体数组<span style="font-size:14px;">Student stu[5] = {
        {"hehe", 21, 78.0},
        {"haha", 22, 45.8},
        {"hiahia", 24, 64},
        {"heihei", 23, 56.0},
        {"heihi", 28, 67.0}
    };
    (p + 3)->name = "duck";
    p[2].age = 50;
    p[1].score = 59.9;
    (*(p+3)).name = "duck"
</span>10.练习:取出字符串中的数字
方法1:这种方法用到strcpy存在bug
<span style="font-size:14px;">   
 char b[30] = "sdfgdg12sd12gd2132432fsg";
    //
    char *p = b;
    printf("%s\n",b);
//    int i = 0;  
//    while (p[i] != '\0') {
//        if (p[i] >= '0' && p[i] <= '9') {
//            //p = p + 1;
//            strcpy(p + i, p + i + 1);
//            i--;
//        }
//        i++;
//    }
//    printf("%s",p);
    
    //或者
    while (*p != '\0') {
        if (*p >= '0' && *p <= '9') {
            //p = p + 1;
            strcpy(p, p + 1);
            p--;
        }
        p++;
    }
    printf("%s",b);
</span>方法2:<span style="font-size:14px;"> 
    char b[]={"adsddddfff65565665dd4s"};
    char *p = b;                    //p指向a[0]
    int k=0;                        //记录字符串中数字的个数
    for (int i = 0; i < sizeof(b); i++) {
        if (*p >= '9' || *p <= '0') {       //判断是不是字符,是字符则执行
            if (k!=0) {
                *(p - k) = *p;                 //将数字后的字符付给最前面的数字所在的位置
                *p='\0';                   //将前移的字符所在的位置付成\0
            }
            p++;                           //指针前移
        }else  if('0' < *p && *p < '9'){
            k++;
            p++;                           //指针前移
        }
    }
    printf("%s",b);
    
</span>
const面试题:
<span style="font-size:14px;">    /**
     * p 是指针变量,存储p地址
     * *p 是指向变量指向的空间,也就是变量a的空间
     *
     *  面试题:请问const修饰的谁不可变?
     * 1.const int *p = &a;//修饰*p,即*p不可变,不能通过指针变量p修改指向空间的内容,但是指针变量p可以重新赋值,重指向.
     *  测试1: *p = 10; p = &b;
     * 2.int const *p = &a;//修饰*p,即*p不可变,不能通过指针变量p修改指向空间的内容,但是指针变量p可以重新赋值,重指向.
     *  测试2: *p = 10; p = &b;
     * 3.int * const p = &a;//修饰p,即p不可变,能通过指针变量p修改指向空间的内容,但是指针变量p不可以重新赋值,不能重指向.
     *  测试3: *p = 30; p =&a;
     * 4.const int * const p = &a;//修饰*p以及p ,都不可以改变,不能通过指针变量p修改指向空间的内容,指针变量p也不可以重新赋值,不能重指向.
     *  测试4: *p = 10; p =&a;
     *
     */</span>
标签:style blog ar io color os 使用 sp for
原文地址:http://blog.csdn.net/zfx5130/article/details/42010103