C语言:指针,指针与数组

首先要知道不管你的指针是什么类型,是几级指针,在同一个操作平台编译环境中,所占的内存空间都是一致的。如pc使用的是32位的,那就是 32/8=4,那就是4个字节内存空间。
例:

#include <stdio.h>
#include <stdlib.h>

int main()
{
     int i = 1;
   	 int *p = &i;//分开写是 int *p;p=&i;

    printf("i = %d\n",i);//简单取值
    printf("&i = %p\n",&i);//取出 i对应的地址
    printf("p = %p\n",p); //p存储的是一个地址,这个地址是&i。
    printf("&p = %p\n",&p);//p自己也有一个地址
    printf("*p = %d\n",*p);//相当于在p的存储的地址中取值,而p的存储的地址是&i对应的地
                    //址,在这个地址里取值,就是i的值。
 return 0;
}

在这里插入图片描述
解释:通俗点说,i变量是在内存有地址的,这个地址比如说0x2000,实际上对应我的电脑是0x7fff1035aedc,在图上可以看见;而这个i的变量对应的值是1。而指针p是存储i这个变量对应的地址,因为指针是负责存地址的,由上式 int *p = &i可知道,但是p这个指针自己也在内存也存有一块地址,比如说是0x3000,那么这个是指针自身的地址,&p=0x3000。上述是一级指针。二级指针继续往下看,

#include <stdio.h>
#include <stdlib.h>

int main()
{
    int i = 1;
    int *p = &i;//分开写是 int *p;p=&i;
    int **q =&p;
    
    printf("i = %d\n",i);//简单取值
    printf("&i = %p\n",&i);//取出 i对应的地址
    printf("p = %p\n",p); //p存储的是一个地址,这个地址是&i。
    printf("&p = %p\n",&p);//p自己也有一个地址
    printf("*p = %d\n",*p);//相当于在p的存储的地址中取值,而p的存储的地址是&i对应的地
                        //址,在这个地址里取值,就是i的值。
    printf("q = %p\n",q);
    printf("&q = %p\n",&q);
    printf("*q = %p\n",*q);
    printf("**q = %d\n",**q);
    return 0;
}

在这里插入图片描述
在这里插入图片描述
说到指针,我们也不能忘记了还有两个指针,一个是空指针,一个是野指针。
空指针:一开始不知道这个指针要具体存放啥时,就先将其设为空指针,常见为NULL。
野指针:当前这个指针所指向的空间是不确定的,但还需要使用。
例:

#include "stdio.h"
#include "stdlib.h"

int main()
{
    int *p = NULL;//空指针
    int *q;//野指针

    return 0;
}

接下里是指针与数组的关系
例:

#include <stdio.h>
#include <stdlib.h>

int main()
{
    int a[3] = {1,2,3};
    int i;
    int *p = a;
    
    for(i = 0;i < sizeof(a)/sizeof(a[0]);i++)//sizeof a 表示是整个数组占据的大小,sizeof a0 表示是第一占据大小 相除可以得到具体多少块
     {
     	printf("%p-->%d\n",&a[i],a[i]);
    	printf("%p-->%d\n",a+i,a[i]);
    	printf("%p-->%d\n",p+i,a[i]);
    	printf("%p-->%d\n",p+i,*(p+i));
    }
    return 0;
}

在这里插入图片描述
潇洒的结论:
a[i]可表示 a[i] = *(a+i) = *(p+i) = p[i]
&a[i]可表示 &a[i] = a+i = p+i = &p[i]

#include <stdio.h>
#include <stdlib.h>

int main()
{
    int a[3];
    int i;
    int *p = a;
    for(i = 0;i < sizeof(a)/sizeof(*a);i++)
    	printf("%p-->%d\n",&a[i],a[i]);
    
    for(i = 0;i < sizeof(a)/sizeof(*a);i++)
    	scanf("%d",p++);
    	//scanf("%d",&a[i]);
    	//scanf("%d",&p[i]);
    
    p = a;//将自增完的地址重新赋值
    
    for(i = 0;i < sizeof(a)/sizeof(*a);i++,p++)
    	printf("%p-->%d\n",p,*p);
    printf("/n");
    exit(0);
}

来一个指针运算

#include <stdio.h>
#include <stdlib.h>

int main()
{
    int a[6] = {5,1,7,3,8,3};
    int y;
    int *p = &a[1];
    
    y = (*--p)++;//在p地址的基础上地址自减一个元素,所以y的值为a[0]=5
    			 //在执行完取值的操作后,a[0]所存放的值自增1
    
    printf("y = %d\n",y);
    printf("a[0] = %d\n",a[0]);
    exit(0);
}

猜你喜欢

转载自blog.csdn.net/weixin_45075787/article/details/114385328