zoukankan      html  css  js  c++  java
  • C基础

    &表示取变量的地址值

    int main(int argc, const char * argv[]) {
        int i;
        char a;
        i = 30;
        a = 't';
        printf("%p
    %p
    ",&i,&a);
        return 0;
    }
    运行结果:
    0x7fff5fbff83c
    0x7fff5fbff83b
    Program ended with exit code: 0
    

      

    int *p; p表示的是一个指针变量,它的值是某个整型变量的地址。int * 是一个数据类型,叫做指针类型。

    内存单元的地址称为指针。专门用来存放地址的变量,称为指针变量(pointer variable)。在不影响理解的情况下,有时对地址、指针和指针变量不区分,通称指针。

    所有数据类型的指针(整型、字符型、数组、结构等)在32位机上都是32位(4个字节)。也就是说指针只与操作系统有关。
     
    例如:
    staic int p1; /p1是指向静态整型变量的指针变量/
    float p2; /p2是指向浮点型变量的指针变量
    /
    char p3; /p3是指向字符型变量的指针变量/
    对于指针变量的定义,需要注意以下两点。
    ① 指针变量的变量名是“
    ”后面的内容,而不是“p2”、“p3”。“*”只是说明定义的是一个指针变量。
    ② 虽然所有的指针变量都是等长的,但仍然需要定义指针的类型说明符。因为对指针变量的其他操作(如加、减等)都涉及指针所指向变量的数据宽度。要注意的是,一个指针变量只能指向同类型的变量。上例中的p2只能指向浮点型变量,不能时而指向一个浮点变量,时而又指向一个字符型变量。

    指针变量的值只能是变量的地址,不能是其他数据,否则将引起错误。
     
    C语言中提供了地址运算符“&”来表示变量的地址,其一般形式为: &变量名;
    如“&a”表示变量a的地址,“&b”表示变量b的地址。
     
    & — 取地址运算符;
     * — 指针运算符(间接存取运算符)。
    如:int a = 100;  int * p = &a;
    两个运算符互为逆操作。例如“&a”或者“p”就是取变量a的地址,而“a”或者“ * p”就是取指针变量a所指向的存储单元里的内容。通过一个指针访问它所指向的对象的值称为变量的间接访问(通过操作符“”)。

     代码展示:

    int main(int argc, const char * argv[]) {
        //int a,b;
        //printf("%d
    ",p(a));
    
        //指针的运算
        int a = 10;
        double  b = 20;
        int *p = &a;
        double *q = &b;
        printf("a = %d &a = %p
    ", a, &a);
        printf("p = %p p+2 = %p
    ", p, p+2);
        printf("b = %f &b = %p
    ", b, &b);
        printf("q = %p q+2 = %p
    ", q, q+2);
        return 0;
    }
    运行结果:
    a = 10 &a = 0x7fff5fbff83c
    p = 0x7fff5fbff83c p+2 = 0x7fff5fbff844
    b = 20.000000 &b = 0x7fff5fbff830
    q = 0x7fff5fbff830 q+2 = 0x7fff5fbff840
    Program ended with exit code: 0
    

      

    通过上面的例子,我们可以看到,p保存的地址就是a的地址,对指针变量p进行加2,实则就是相当于在地址上进行偏移同一数据类型占字节乘以2,我们已经知道,sizeof(int)是4,sizeof(double)是8。根据程序结果, 整型指针p+2,地址增加了8,相当于两个整数。double指针q+2,增加了16,相当于两个双精度浮点数。注意此程序是在研究指针的运算,打印p+2,q+2代表的地址。并没有修改对应的内存单元的内容。
    两指针相减运算,p-q 运算的结果是两指针指向的地址位置之间相隔数据的个数。因此,两指针相减不是两指针的值相减的结果,而是按下列公式计算出的结果:(p-q)/类型字节的长度

    我们首先首先定义一个结构类型,

    struct student
    {
       char *name;
       int ages;
    };

    再根据类型定义结构体变量 struct student stu={"Rose",15};定义一个指针指向结构体类型,struct student *p;把结构体变量stu的地址赋给指针变量p,p=&stu;我们可以有3种方式来访问结构体中的属性ages:

    stu.ages=15;(*p).ages=15;p->ages=15;不过第三种方式在C语言中只能用来指向结构体。

    C++中::的用法:

    1、作用域符号 

    前面一般是该类名称,后面是该类的成员名称。C++为避免不同的类有相同的成员而采用作用域的方式进行区分,eg:A,B表示两个类,在A,B中都有成员member,那么:A::member表示A中的成员member,B::member表示B中的成员member。 

    2、全局作用域符号 

    当全局变量在局部函数中与其中某个变量重名时,可以用::来区分,否则局部变量会屏蔽全局变量。 

    3、作用域分解运算符 

    比如声明了一个类A,类A里声明了一个成员函数void f(),但没有在类的声明里给出f函数的定义,那么在类外定义f时,就要写成void A::f(),表示这个f函数是类A的成员函数。
     
     
     

     

  • 相关阅读:
    Modernizr使用指南(转)
    使用Func<>和Action简化委托
    实现类似MVC ViewBag类型的对象
    更改服务器的SID 加入域控制器提示SID重复
    SQL SERVER 执行大于80M的SQL 脚本
    完全关闭IIS日志,包括System32下的LogFile
    MVC不用302跳转Action,内部跳转
    SHA1l加密
    获取当前时间戳
    invoke反射
  • 原文地址:https://www.cnblogs.com/zhlblogs/p/13924904.html
Copyright © 2011-2022 走看看