zoukankan      html  css  js  c++  java
  • c语言指针的简单实例

    c语言的指针的存在使得c语言对硬件的操控,以及灵活性得到了极大的提高。

    但是指针的使用存在着很多难点问题。

    #include<stdlib.h>
    #include<stdio.h>
    //这里的函数是指针做参数的例子,要知道这个特性可以弥补c语言只能有一个返回值的特性。
    void swap1(int *pa,int *pb){
        int t =*pa;
        *pa=*pb;
        *pb=t;
    }
    //main()函数必须要返回一个数字
    int main(){
        int a =15;
        int b=10;
        int* t;
        t=&b;
        a=b;
        b=*t;
        printf("%d
    ",b);
        swap1(&a,&b);
        printf("%p	%p",a,b); 
        return 0;
    }

    这里我们先定义两个整型的变量a,b

    然后再定义一个临时的指针变量,用来存储中间变量

    然后将b的变量的内存地址赋值给t,注意这里 t  代表的是内存地址

    然后把b的值给a,再用b接受t地址所存储的变量, 注意这里的*t是指t这个地址所指的那个变量。

    指针与数组

    其实数组的int a[10];

    里来说a其实是这个数组的第一个元素的a[0]的指针

    所以数组变量本身就是表达地址,所以

     1   int a[10];
     2   int *p=a; //无需用&取地址
     3 
     4 但是数组的单元表达的是变量,需要用&取地址  
     5   a==&a[0];
     6 
     7 []运算符可以对数组做,也可以对指针做:
     8 
     9 
    10    p[0] <==>a[0];
    11 这里的p[0]相当于*p
    12 
    13 *a可以表示a[0]
    14 
    15 数组变量是const的指针

    const 这个修饰符的作用就是表明一个变量是指定的值不能改变了

    int* const p=&i; //p是const
    
    *q=26;//OK
    q++; //ERROR
     1   int ls=58;
     2     int ls1=64;
     3     int* const q=&ls;
     4     *q =10;
     5     *q=20;
     6 //  q = &ls1;   这句是不能通过编译的,因为这个指针是不能指向其他位置的地址 
     7     //执行成功说明这里的指针变量是可以被改变的
     8     ls=36 ;
     9     printf("
    %d",*q);
    10     //然后我们来看另外一种情况
    11     int P1=10;
    12     int P2=20;
    13     int const *T=&P1;
    14     T=&P2;//执行结果为30
    15     //*T =15;这里是不能通过编译的,因为这个指针指向的位置存储的变量是不能赋值改变的。 
    16     P2=30; 
    17     printf("
    %d",*T);
    18     //关键在于这里的const是在*的前面还是后面决定的 
    19     return 0;
    1 void mai(const int*p){
    2        
    3        int *ls=*p; 
    4            printf("ls的地址:%p",ls);
    5 } 
    6 这里我们传入了一个指针,但是在函数里,是不能改变这个指针所指向的值的

     指针的运算

     1 #include<stdio.h>
     2 #include<stdlib.h>
     3 
     4 int main(){
     5     int i,j;
     6     i=10;j=12;
     7     printf("i,j:%d,%d
    ",&i,&j);
     8     printf("i,j:%d,%d",*&i+1,&j);
     9     printf("
    &i-&j:%d",(&i)-(&j));//这里两个地址做差其实是地址差/类型所占的位数
    10 
    11     int *p;
    12     p=&i;
    13     *p++;//实际上是*(p++);++优先级比*高;数组遍历
    14     printf("
    *p:%d",*p);
    15     return 0;
    16 }

    指针的类型转换

    void*表示不知道指向什么东西的指针

    指针变量的大小是相同的但是,指针是有类型的差别

    总之指针的作用

    1、需要传入较大的数据的时候用做参数
    2、传入数组后对数组做操作
    3、函数返回的结果不止一个的时候可以用指针带出(c只能return一个变量,或者值)
         需要要用函数来修改不止一个变量
    4、动态申请内存.......

    具体的后续会更。

  • 相关阅读:
    关于Hibernate(JPA)关联关系加载的默认值
    (转)存储过程语法及实例
    网页qq
    git的代理配置
    The problem with POSIX semaphores 使用信号做进程互斥必看
    git merge conflict的处理
    转载:telnet协议详细描述
    Mac OS X terminal滚动慢的问题
    进程间通讯 信号量函数 semget() semop() semctl()
    .hpp文件和.h文件的区别
  • 原文地址:https://www.cnblogs.com/BlogOfMr-Leo/p/8977142.html
Copyright © 2011-2022 走看看