指针及指针相关问题(上)(关于我自己的理解,如有不妥还望指正)

指针

1、int a              表示整数a

2、int *a           指向整型的地址,名称叫a(一级指针,表示a所指向的地址里面存放的是一个int类型的值)

3、int* a            整形的指针,名称叫a

4、int **a           二级指针,表示a所指向的地址里面存放的是一个指向int类型的指针

2和3在用法上没有区别,理解上有区别:前者表示a地址指向的类型是整型,后者表示a是整个整形的指针,用起来的效果是一样的(学习时无需多虑)

通俗来讲:*和&是互逆的,&表示取地址符,*是访问里面的东西,&表示获取地址。

指针就像是酒店的房卡,客人表示数据,房卡上面存放着房间号(即客人的地址),来访人员经过房卡找到房间号,从而访问数据,

#include<stdio.h>
void main()
{
    int *x,*y; /*定义指针变量(变量的指针:存储变量的地址,指针变量:存储指针的变量)*/
    int a,b;
    x = &a;
    y = &b;
    scanf("%d%d",&a,&b);
    printf("%d %d",*x,*y);  /*号代表通过操作对象的地址,获取操作对象存储的内容,*x代表通过a的地址 
                              获取a的内容*/
}

 指针变量指的是x,y,而不是*x,*y     定义的是整数类型的指针变量x,y.(因为我自己初学时经常搞混,所以强调一下)。

举例:用指针定义函数,用以找出两数最大值

#include<stdio.h>
void *max(int* x,int* y)
{
    int* t;
    if(*x>*y)              /*若地址x存储的数据大于地址y存储的数据,则返回x的地址*/
        t = x;
    else
        t = y;
    return t;           
}
int main()
{
    int a,b,*p;
    scanf("%d%d",&a,&b);
    p = max(&a,&b);         /*函数调用的是指针(即数据的地址)*/
    printf("max = %d",*p);  /*返回的是地址,访问里面的值要用‘*’ */
    return 0;
}

避免访问野指针:

#include<stdio.h>
int main()
{
    int *a;
    *a = 123;
}
/*此种类型为野指针,因为指针a未初始化,虽然已经为*a赋值,但不知道该指针指向哪个地址*/

指针和数组

一、数组名就是一个地址信息(第一个元素的地址)

#include<stdio.h>
int main()
{
    int str[123];
    printf("input your name:");
    scanf("%s",str);/*没用&*/
    printf("your name is:%s\n",str);
    return 0;
}
/*输入:CSDN    输出:CSDN*/

二、指向数组的指针

char *p;

p = a;//语句1

p = &a[0];//语句2

三、指针的运算

当指针指向数组是可以对指针进行加减运算,意义是距离指针所知位置向前或向后第N个元素

#include<stdio.h>
int main()
{
    char *p;
    char name[40];
    p = name;
    scanf("%s",name);
    printf("*p=%c *(p+1)=%c *(p+2)=%c",*p,*(p+1),*(p+2));
    return 0;
}
/*输入:CSDN   输出:*p=C *(p+1)=S *(p+2)=D  */

注意这里的+1不是将p指向的地址+1,而是让指针p指向下一个元素

指针和数组的区别

数组名就是一个地址,指针是一个左值(左值:可以被复制的变量)

四:指针数组和数组指针

int *p1[5];         /*指针数组*/

int *(p2)[5];        /*数组指针*/

运算优先级:[ ]>*

‘p1’先被定义为数组,再是一个指针(指针数组是一个数组,每个数组元素存放一个指针变量)

#include<stdio.h>
#include<string.h>
int main()
{
    char *p1[5] = {"EDG","CHAMPION","WORLDE"};
    int i;
    for(i=0;i<3;i++)
    {
        printf("%s ",p1[i]);
    }
    return 0;
}
/*输出:DEG CHAMPION WORLDE*/

数组指针

int (*p2)[5];

运算优先级:()>[ ]

一个指向一整个数组的指针(而不是仅指向第一个数组元素)

/*有些同学在使用数组指针时会这样定义*/
#include<stdio.h>
int main()
{
    int data[5];
    int (*p2)[5] = data;
    for(int i=0;i<5;i++)
    {
        printf("%d ",(*p2)[i]);
    }
    return 0;
}
/*此时程序会报错,因为这位同学忽略了数组名data仅表示数组第一个元素的地址,而这里的数组指针表示整个数组*/

正确应写为:

#incldue<stdio.h>
int main()
{
    int data[5] = {1,2,3,4,5};
    int (*p2)[5] = &data;     /* P2表示地址的地址*/
    for(int i=0;i<5;i++)
    {
        printf("%d ",*(*p2+i));    /* *p2+i表示数组中第i个元素的地址*/
    }
    return 0;
}
/*输出:1,2,3,4,5*/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值