c语言指针

指针

文章目录

  • 指针
    • 1.含义
    • 2.语法
    • 3.变量地址和指针值输出
    • 4.null指针
    • 5.指针变量
    • 6.指针偏移量
    • 7.一级指针
    • 8.二级指针
    • 7.多级指针
    • 8.数组指针
    • 9.指针数组
    • 10.一维数组与指针
    • 11.二维数组指针
      • 11.1二维数组

1.含义

指针也就是内存地址,指针变量是用来存放内存地址的变量;

2.语法

type *var_name;
int    *ip;    /*一个整型的指针 */
double *dp;    /* 一个 double 型的指针 */
float  *fp;    /* 一个浮点型的指针 */
char   *ch;    /* 一个字符型的指针 */

3.变量地址和指针值输出

&内存,(&是取地址运算符);打印指针值/地址值: %p,显示方式为一个十六进制整数。不能打印出指针的偏移量。
p指向地址,*p取地址值
#include 
int main()
{ 
    int a=996;
    //*P 表示 p指向a在内存所在地址值
    int *p
  	//p-->&a p指向a在内存所在地址, &a指向a, 变量p保存了a的地址
    p=&a;
    printf("%p\n",&a);//0x3ffe76343a00这个值是随机的
    printf("%d\n",*p);//996
    return 0;
} 

4.null指针

在变量声明的时候,如果没有确切的地址可以赋值,为指针变量赋一个 NULL 值是一个良好的编程习惯。赋为 NULL 值的指针被称为空指针。
大多数的操作系统上,程序不允许访问地址为 0 的内存,因为该内存是操作系统保留的。然而,内存地址 0 有特别重要的意义,它表明该指针不指向一个可访问的内存位置。但按照惯例,如果指针包含空值(零值),则假定它不指向任何东西。
#include 
int main()
{ 
    int *p=NULL;
    printf("%P\n",p);// 0x0
    return 0;
} 

5.指针变量

用于存储地址的变量,即用于存储指针的变量。指针变量占用1个字长的存储空间。
   语法: 类型 *变量名
   int  *p1
   char *p2;
   short *p3;
   long *p4;
   int (*p5)[4];
   int *p6[4];
   void(*p7)(int,int)

6.指针偏移量

指针偏移 就是指针的加减运算,实现指针指向地址的偏移。
数据类型 内存空间(字节) 指针加1的地址偏移量
char 1 1
short 2 2
int 4 4
float 4 4
double 8 8

7.一级指针

含义:

c语言指针_第1张图片

int a = 15;      
int * b = &a;    //一级指针,定义一个指针变量b,将整型变量a的地址(指针)赋值给b
//b-->a 的地址,*b取到地址a的值
 printf("%d\n",*p);//15

8.二级指针

含义:一级指针的指针

int a = 15;     
int * b = &a;    //一级指针b--->a的地址
int **c = &b;    //二级指针,指针c指向的是指针b,也就是说二级指针c存储的是一级指针b的地址

c语言指针_第2张图片

7.多级指针

含义:多级就是n 级指针就是 指向 n-1 级指针的指针

int a = 15;     
int * b = &a;    //一级指针b--->a的地址
int **c = &b;    //二级指针,指针c指向的是指针b,也就是说二级指针c存储的是一级指针b的地址。
int ***d = &c;   //三级指针,指针d指向的是指针c的地址

c语言指针_第3张图片

三级指针前面加一个取地址运算符,也就是&d,则取出的是其自身的存储地址。
d则是取到指针c的地址,而d则是取到指针b的地址,而******d则是取到a地址上的数据。
想要获取指针指向的数据时,一级指针加一个,二级指针加两个,三级指针加三个***

8.数组指针

sizeof(a)&a时,才能把a当数组,其它情况都把a当作指针。
int (*p2)[3];
小括号让 p2 与 * 结合,表示 p2 是一个指针,这个指针指向了一个数组,数组中有 3 个元素,每一个元素的类型是 int 型。

9.指针数组

c语言指针_第4张图片

int *p1[3];
中括号[]的优先级高,因此与 p1 先结合,表示一个数组,这个数组中有 3 个元素,这 3 个元素都是指针,它们指向的是 int 型数据。

10.一维数组与指针

c语言指针_第5张图片

#include
void arr(){
    int arr[3]={1,2,3};//数组名arr只有在sizeof(arr)与&a的时候才被当作数组,其他时候为指针。
    int *p=&arr;//p-->a的地址
    //打印数组
    for(int i=0;i<3;i++){
        printf("%d",*(p+i));
    }
    printf("\n");//123
}
int main(){
    arr();
    return 0;
}

c语言指针_第6张图片

11.二维数组指针

11.1二维数组

1.含义:

二维与二级以上的数组,叫多维数组.
在本质上,是一个一维数组的列表。声明一个 x 行 y 列的二维整型数组
二维数组与一维数组一样,分配的内存也是相同类型元素的连续内存.
跟一维数组不一样,创建二维数组时,如果没有初始化,则元素的值是不可确定的.(static修饰时,有确认的默认值0)
c语言指针_第7张图片

c语言指针_第8张图片

二维数组指针偏移量

偏移量: &a->a, 整个数组长度。a->a[0], a[0]有多长,a的偏移量就有多长。

include <stdio.h>
//二维数组与指针
int main(int argc, char *argv[])
{ 
    int arr[2][3]={1,2,3,4,5,6};
    int *p=&arr;
    for(int i=0;i<2;i++){
        for(int j=0;j<3;j++){
            printf("arr[%d][%d]%d\n",i,j,arr[i][j]);
            //printf("%d\n",p+1);
        }
    }
    //p->a[0][0]=1
    printf("%d\n",*p);
    //p->a   p+1->a[0+1]
    printf("%d\n",p+1);
    //*p+1->a[0][1];//2
    printf("%d\n",*(p+1));
    //p->a p[0]==a[0][0]
    printf("%d\n",p[0]);
    //p-a p[4]==a[1][0]
    printf("%d\n",p[3]);
    return 0;
} 

你可能感兴趣的:(c语言,开发语言)