zoukankan      html  css  js  c++  java
  • C 指针

    变量三要素:
    变量名,变量类型,变量值。

    变量作用范围
    局部:只在特定范围内起作用。
    全局变量:在整个程序运行期间起作用。

    存储类型
    auto(自动):默认,自动变量动态的分配内存空间,数据存储在动态存储区内。
    static(静态):在函数初始化的时候就分配空间,而且数据存储在静态存储区内,在程序运行期间,变量的存储空间不会被释放掉。
    register(寄存器变量): 存放在寄存器中,大大提高CPU读取效率。 register int i = 0;

    指针变量
    int *p = &a;
    p变量的值为a变量的内存地址,该指针指向的数据类型为int类型。

    int (*p)(int,int)
    指向函数的指针,指针指向一个函数入口。
    判断方法:p先和*结合,为一个指针。后和(int,int)结合,指针指向返回值为int 的函数。

    float *fun(int a);
    函数返回值为float类型指针。

    int *p[4];
    指针数组,数组元素为指针。
    判断方法:p和[4]结合为一个数组,数组存储的类型为int类型指针。

    float (*pointer)[4]
    指向一维数组的指针,指针指向长度为4的数组。
    判断方法:pointer和*结合,为一个指针。该指针指向一个长度为4的,存有float类型的数组。

    预定义宏
    系统运行期间,自动注册的变量。
    __LINE__:当前行
    __FILE__:当前文件
    __DATE__:当前日期,月/日/年
    __TIME__:当前的时间,时:分:秒
    _cplusplus:在编译一个C++程序时定义
    __STDC__:在编译一个C程序时定义,编译C++时也有可能定义

    指针、内存地址和指针取值

    指针是一个存储计算机内存地址的变量,引用表示计算机内存地址,从指针指向的内存地址中读取数据称作指针取值。

    指针可以指向某些具体类型的变量地址,例如:int、long和double。

    当声明变量时,用 * 表示这里声明了一个指针。其它情况用到 * 表示指针的取值。&是地址操作符,用来引用一个内存地址。通过在变量名字前使用&操作符,我们可以得到该变量的内存地址。

    void指针: 指针可以被声明为void类型,未定义它指向哪一种类型数据。
    野指针:指向一块未知内存区域的指针,如:未赋值或直接赋值为内存地址。
    空指针:赋值为NULL的指针。

    指针和数组

    C语言的数组表示一段连续的内存空间,用来存储多个特定类型的对象,指针用来存储单个内存地址。数组和指针不是同一种结构因此不可以互相转换,而数组变量指向了数组的第一个元素的内存地址。指向数组的指针必须声明为void类型或者和数组的元素类型保持一致。

    一个数组变量是常量,即使指针变量指向同样的地址或者另一个数组,也不能把指针赋值给数组变量。也不能将一个数组变量赋值给另一个数组。但可以把一个数组变量赋值给指针,把数组变量赋值给指针时,实际上是把指向数组第一个元素的地址赋给指针。

    指针和结构体

    指向结构体的指针存储了结构体第一个元素的内存地址。指向结构体的指针必须声明为void类型或者和结构体类型保持一致。

     1 #include <stdio.h>
     2 
     3 int main(int argc, char *argv[]){
     4 
     5     int *p;  //声明一个int指针(未初始化)
     6     void *void_p; //空指针,可以存储任意类型的指针或引用
     7     int *null_p = NULL; //NULL指针
     8 
     9     int a = 1; //声明一个int变量
    10 
    11     printf("未初始化:	 *p=%p 
    ", p);
    12 
    13     p = &a; //为指针分配一个int变量的引用
    14     printf("赋值后:	 *p=%p 
    ", p);
    15 
    16     int b = *p; //对指针取值,即获取指针指向地址空间里的内容
    17     printf("取值:	 *p=%d b=%d 
    ", *p, b);
    18 
    19     a = 10; //改变a的值
    20     printf("再取值:	 *p=%d b=%d 
    ", *p, b);
    21 
    22     void_p = p;// void_p 指向另一个指针
    23     printf("void指针:	 *void_p=%d
    ", *(int *) void_p); //通过显示转换,把一个void指针转成int指针并进行取值
    24 
    25 
    26     int array[5] = {0, 1, 2, 3, 4};
    27     p = array;
    28 
    29     printf("指向数组的指针:	 array[0]=%d, array[1]=%d, array[2]=%d 
    ", *(p), *(p + 1), *(p + 2));
    30 
    31 
    32     struct person {
    33         int age;
    34         char *name;
    35         int height;
    36     };
    37     struct person man;
    38     struct person *man_p;
    39 
    40     man.age = 21;
    41     man.name = "张三";
    42     man.height = 176;
    43 
    44     man_p = &man;
    45     printf("结构体指针:	 name=%s, age=%d, height=%d 
    ", man.name, (*man_p).age, man_p->height);
    46 
    47     exit(0);
    48 
    49 }
  • 相关阅读:
    正则表达式积累
    Windows界面编程第七篇 文件拖拽(文件拖放)
    设置 Eclipse 智能代码提示,大幅度减少 alt+/ 使用频率,打每个字都出现代码提示的办法
    CodeFx:一站式微软开发技术解决方案 .
    JS添加可信站点、修改ActiveX安全设置,禁用弹出窗口阻止程序的方法
    Eclipse支持HTML&JS&ExtJS&jQuery代码智能提示
    如何在Web上判断是否已经安装了某个ActiveX控件
    去掉Eclipses的鼠标悬浮提示和增加输代码提示
    在jsp页面下, 让eclipse完全支持HTML/JS/CSS智能提示
    Java集合类ArrayList循环中删除特定元素
  • 原文地址:https://www.cnblogs.com/zbseoag/p/10698195.html
Copyright © 2011-2022 走看看