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的成员函数。
     
     
     

     

  • 相关阅读:
    237. Delete Node in a Linked List
    430. Flatten a Multilevel Doubly Linked List
    707. Design Linked List
    83. Remove Duplicates from Sorted List
    160. Intersection of Two Linked Lists
    426. Convert Binary Search Tree to Sorted Doubly Linked List
    142. Linked List Cycle II
    类之间的关系
    初始化块
    明确类和对象
  • 原文地址:https://www.cnblogs.com/zhlblogs/p/13924904.html
Copyright © 2011-2022 走看看