zoukankan      html  css  js  c++  java
  • 指针

    指针定义

    指针的4个要素

    指针类型把指针声明语句里的指针名字去掉,剩下的部分就是这个指针的类型

    int*ptr;//指针的类型是int*

     

    指针指向的类型:

    把指针声明语句中的指针名字和名字左边的指针声明符*去掉,剩下的就是指针所指向的类型.

    int*ptr; //指针所指向的类型是int

    char*pch; //指针所指向的类型是char

    ptr = (int*)pch;//12的区别,int类型的指针本应该指向int类型的存储区域,现在却强行指向了char类型(就是把char类型当int类型用了),所以指针的类型和其指向的类型可以是不同的(这样通常会导致各种问题发生)

     

    指针的值(指针指向的内存地址)

     

    指针本身占用的存储空间:

    指针变量用于存放变量地址,地址通常为4字节(32位系统)

    与指针表达式(返回指针的表达式)的左值(赋值操作符的左边)有关

    Int a = 10;

    Int b[]={1,2};

    Int* p=&a;//&a是指针表达式,没有固定存储空间不能左值

    P = b;

    P++;//是指针表达式,有固定存储空间可以左值

     

    初始化

    指针变量定义后其值为随机数,若此随机数为系统区的地址,则对该指针变量所指系统区某存储单元进行赋值运算,将改变系统区该单元中内容,可能导致系统的崩溃。所以,指针变量定义后必须赋某个变量的地址或0

    赋值

    针变量赋初值有三种情况:

    第一种情况是用取地址运算符"&"将变量地址赋给指针变量。如:p=&a

    第二种情况是将一个指针变量中的地址赋给另一个指针变量,如:p1=p

    第三种情况是给指针变量赋空值0,如q=0;表示该指针变量不指向任何变量。

     

    例子:

    Int a = 100;

    Int *p = &a;

     

    指针符号与其他符号组合的优先级

    :

    int *p;

    int *p[3];   P 是一个由返回整型数据的指针所组成的数组

    int (*p)[3];  P 是一个指向由整型数据组成的数组的指针

    Int (*p)(int);  P 是一个指向有一个整型参数且返回类型为整型的函数的指针

    int *(*p(int))[3]; P 是一个参数为一个整数据且返回一个指向由整型指针变量组成的数组的指针变量的函数.

    开始,先与()结合,说明是一个函数,然后进入()里面,int 结合,说明函数有一个整型变量参数,然后再与外面的*结合,说明函数返回的是一个指针,,然后到最外面一层,先与[]结合,说明返回的指针指向的是一个数组,然后再与*结合,说明数组里的元素是指针,然后再与int 结合,说明指针指向的内容是整型数据.

     

    指针运算

    一个指针ptrold ()一个整数后,结果是一个新的指针ptrnewptrnew 的类型和ptrold 的类型相同,ptrnew 所指向的类型和ptrold所指向的类型也相同。ptrnew 的值将比ptrold 的值增加(减少)sizeof(ptrold 所指向的类型)个字节。就是说,ptrnew 所指向的内存区将比ptrold 所指向的内存区向高()地址方向移动了sizeof(ptrold 所指向的类型)个字节。

     

    :

    char a[20]=" You_are_a_girl";

    char *p=a;

    char **ptr=&p;

    printf("**ptr=%c ",**ptr);//输出Y

    ptr++;

    printf("**ptr=%c ",**ptr);//输出随机值

     

     

    两个指针相加无意义,指向未知区域,两个指针可以相减,数组可以用,很少用

    指针类型

    数组指针

    int array[10]={0,1,2,3,4,5,6,7,8,9},value;

    value=array[0]; //也可写成:value=*array;

    value=array[3]; //也可写成:value=*(array+3);

     

    char *str[2]={

    "Hello,thisisasample!",

    "Hi,goodmorning.",

    };

    chars[80]

    strcpy(s,str[0]); //也可写成strcpy(s,*str);

    strcpy(s,str[1]); //也可写成strcpy(s,*(str+1));

     

     

    声明了一个数组TYPE array[n],则数组名称array 就有了两重含义:第一,它代表整个数组,它的类型是TYPE[n];第二,它是一个常量指针,该指针的类型是TYPE*,该指针指向的类型是TYPE,也就是数组单元的类型,该指针指向的内存区就是数组第号单元,该指针自己占有单独的内存区,注意它和数组第号单元占据的内存区是不同的。该指针的值是不能修改的,即类似array++的表达式是错误的。

     

    在表达式sizeof(array)中,数组名array 代表数组本身,故这时sizeof 函数测出的是整个数组的大小。

     

    sizeof(*array)测出的是数组单元的大小

     

    sizeof(array+n)测出的是指针类型的大小。在32 位程序中结果是4

     

    字符串指针

    字符串相当于是一个数组,在内存中以数组的形式储存,只不过字符串是一个数组常量,内容不可改变,且只能是右值.如果看成指针的话,他即是常量指针,也是指针常量

    函数指针

    类指针

    指针与引用

    运算符&:取地址运算符

    &a 的运算结果是一个指针,指针的类型是的类型加个*,指针所指向的类型是的类型,指针所指向的地址嘛,那就是的地址。

    运算符*

    *p 的运算结果就五花八门了。总之*p 的结果是所指向的东西,这个东西有这些特点:它的类型是指向的类型,它所占用的地址是p所指向的地址。

  • 相关阅读:
    你还在把Java当成Android官方开发语言吗?Kotlin了解一下!
    如何站在大数据的角度看100000个故事
    AI从入门到放弃:CNN的导火索,用MLP做图像分类识别?
    Hadoop Yarn REST API未授权漏洞利用挖矿分析
    c# 修饰词public, protected, private,internal,protected的区别
    缩放到被选择的部分: ICommand Cmd = new ControlsZoomToSelectedCommandClass();
    警告 7 隐藏了继承的成员。如果是有意隐藏,请使用关键字 new
    arcgis10.5.1 对齐要素
    arcgis10.1安装出现1606错误怎么办?找不到盘符
    arcmap搜索脚本错误
  • 原文地址:https://www.cnblogs.com/nafio/p/9137713.html
Copyright © 2011-2022 走看看