c语言学习之基础知识点介绍(十四):指针的进阶

一、指针的加、减法运算

/*
1、加法运算
        1)、可以跟整数进行加法运算,得到的还是一个地址
            公式:
                 地址 + 1 = 地址 + 1 * 类型所占的字节数
                 地址 + n = 地址 + n * 类型所占的字节数
        2)、只能跟整数运算,不能跟浮点数运算


 2、指针的减法运算:
        1)、可以跟整数进行减法运算,得到的还是一个地址
 
            公式:
                 地址 - 1 = 地址 - 1 * 类型所占的字节数
                 
                 地址 - n = 地址 - n * 类型所占的字节数
 
        2)、只能跟整数运算,不能跟浮点数运算

*/
//例如:
    //int类型的指针+1,结果等于原地址+4个字节
    //0x7fff5fbff7cc  -  0x7fff5fbff7d0
    /*
    int num = 10;
    int *pNum = #//变量名是pNum  类型是int *
    printf("%p\n",pNum);//0x7fff5fbff7cc
    printf("%p\n",pNum+1); //0x7fff5fbff7d0
    */
    
    //char类型的指针+1,结果等于原地址+1个字节
    //0x7fff5fbff7cf  -  0x7fff5fbff7d0
    /*
    char ch = 'a';
    char *pCh = &ch;
    printf("%p\n",pCh);//0x7fff5fbff7cf
    printf("%p\n",pCh + 1);//0x7fff5fbff7d0
    */
    
    //float类型的指针+1,结果等于原地址+4个字节
    //0x7fff5fbff7cc  -  0x7fff5fbff7d0
    /*
    float f = 10.3f;
    float *p = &f;
    printf("%p\n",p); //0x7fff5fbff7cc
    printf("%p\n",p+1);//0x7fff5fbff7d0
    */
    
    
    //double类型的指针+1,结果等于原地址+8个字节
    //0x7fff5fbff7c8  -  0x7fff5fbff7d0
    /*
    double d = 10.3;
    double *p = &d;
    printf("%p\n",p); //0x7fff5fbff7c8
    
    printf("%p\n",p+1);//0x7fff5fbff7d0
    */
    
    //long类型的指针+1,结果等于原地址+8个字节
    //0x7fff5fbff7c8  -  0x7fff5fbff7d0
    /*
    long num = 10l;
    long *p = #
    printf("%p\n",p);//0x7fff5fbff7c8
    printf("%p\n",p+1);//0x7fff5fbff7d0
    */

    //指针只能跟整数运算,不能跟浮点数运算
    /*
    int num = 10;
    int *p = #
    printf("%p\n",p+1.0); //报错
    */

二、指针加减法的作用

/*
指针跟整数的加法和减法都可以用来遍历数组
加法:
     int nums[3] = {10,20,30};
     int *p = &nums[0];
     for (int i = 0; i<3; i++) {
         printf("%d\n",*(p+i));
     }
 
减法:
     int nums[3] = {10,20,30};
     int *p = &nums[2];
     for (int i = 0; i<3; i++) {
         printf("%d\n",*(p-i));
     }
*/

三、指针和指针的运算

/*
指针可以和指针进行运算,但是只能进行减法运算。
        指针和指针的减法运算,结果是一个long类型。
         a.指针跟指针之间只能做减法运算,加、乘、除、取余都不可以。
         b.指针跟指针之间的运算结果是一个整数,而且是long类型的。
         c.指针跟指针之间的运算,必须是相同类型的指针,否则报错。
 
作用:指针的减法运算,只要是为了计算两个地址之间,相差了几个位(几个相同类型的空间)

        公式:
            地址 - 地址  = (地址 - 地址)/ 类型所占字节数
*/
//例如:
    int num1=10,num2=20,*p1 = &num1,*p2 = &num2;
    printf("%ld\n",p1-p2);//1

四:指针运算的注意事项

/*
 注意:
    指针和整数,不能相数
    指针和整数,不能相除
    指针和整数,不能取余
加法和减法都不能和浮点数进行运算。

*/

五、指针函数的介绍

/*
 指针函数:
        其实应该在中间加一个的字。叫 指针的函数,本质上还是一个函数。
 
        当函数的返回值是一个指针的时候,就叫指针函数。
 
 
 定义语法:
        类型 * 函数名(参数列表){
 
            函数体;
        }
 
    注意:这个*可以放在类型和函数名中间的任意位置。
 
 内存中有一个地方叫栈区,栈区里面放的是局部变量。
 
 有一个特点:出了作用域,就会回收。
 
 
    注意:用指针函数的话,目前没什么用,C语言中的数据类型只要是局部的都是存在栈里面的。
 
 
         用处的话:只能返回全局变量或者返回字符串常量,还可以返回静态变量的地址。

*/
#include <stdio.h>

int qNum = 111;

int *test(){ //函数名是test 返回值是int *
  
//    int num = 1;
    
//    int *p = &num;
    
//    return &num;
    
    return &qNum;
}


char *test2(){
    
    char *str = "qwe";
    
    return str;
}

int main(int argc, const char * argv[]) {
    
    /*
    int *p = test();
    
    int nums[100] = {0};
    
    printf("%d\n",*p);
    */
    
    
    char *str = test2();
    
    printf("%s\n",str);
    
    return 0;
}

函数的指针将在下一篇介绍。

 

posted @ 2015-11-04 16:42  祁临芯  阅读(514)  评论(0编辑  收藏  举报
友情链接:初心商城