c语言的指针和指针变量,c语言中的指针和数组关联

本文详细介绍了C语言中的指针概念,包括指针作为存储地址的特性,指针变量的定义与使用,以及如何避免访问未初始化的指针。此外,文章还探讨了指针与数组的关联,指出数组名相当于首元素地址,并展示了如何通过指针访问数组元素。最后,讨论了如何用指针定义和操作字符串。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、首先什么是指针,很简单,就是代表着一个空间,这个空间指向某个地址,地址里面又存有我们参加的存储的值。

2、指针变量:定义一个变量指向指针所在的地址

3、指针变量的定义,取地址运算符和取值运算符

    首先是指针变量的定义和赋值:

    变量类型(用的是指针指向的地址所存储的值得数据类型)  指针变量名(记得必须加*号) =  一个地址(一般用取址运算符&)

    在定义和初始化之后,比如  char *pa =&a;之后,*pa的类型必须是a变量里面存储的数据类型;

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

int main()
{
    char a='f';
    int b=109;
    char *pa=&a;//定义一个指针,用*作为标示,并进行指针初始化,把指针指向一个地址
    int *pb=&b;
    *pa='n';//*pa表示指针指向的地址的值,pa表示的是指向的地址的地址
    *pb+=123;
    printf("%c\n",*pa);//这里的*是取值运算符
    printf("%d\n",*pb);
    printf("%d\n",sizeof(pa));//pa用sizeof指的是指针表变量的地址,也就是指针变量
    printf("%d\n",sizeof(pb));
    
    return 0;
}

    可以通过指针来修改值或者scanf值

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

int main()
{
    int a;
    int *p=&a;
    scanf("%d",&a);
    printf("%d\n",a);
    scanf("%d",p);
    printf("%d\n",a);
    return 0;
}

4、避免访问未初始化的指针:

    比如下面这个:未定义指针指向的地址,电脑会随机分配地址,由此带来一系列的问题。系统一般会阻止你这样做,会给你报错。

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

int main()
{
    int *a;
    *a=4;
    return 0;
}

5、指针和数组:

指针指向的是一个地址,所以有scanf("%d",p);这样的情况出现,御用&运算符就可以。

而我们在往数组里赋值的时候,scanf("%s",str);也是没有用&取址运算符的,只是因为数组名就代表了数组第一个元素的地址。

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

int main()
{
    char str[250];
    printf("请输入字符串:");
    scanf("%s",str);//注意,没有用到取址运算符&(只有字符串数组和指针scanf才不会用到&,因为他们的名字已经代表地址
    printf("%s\n",str);
    printf("%p\n",str);//用%p打印地址可得,数组名就是数组第一个元素的地址
    printf("%p\n",&str[0]);
    return 0;
}

6、指针指向数组:因为数组名就代表了数组第一个元素的地址,所以把指针指向数组有两种方法

    char *p=str;//指针p指向了数组第一个元素地址

    p=&str[0];//当然,这样也可以

    我们还可以通过指针访问数组的元素:pa+1不是简单的地址加1,而是指向数组的下一个元素。定义指针为什么类型,就加对应类型的字节数。

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

int main()
{
    char str[250];
    char *pa=str;
   // pa=&str[0];或者用这种方法
    printf("请输入字符串:");
    scanf("%s",str);//注意,没有用到取址运算符&(只有字符串数组和指针scanf才不会用到&,因为他们的名字已经代表地址
    printf("%c\n",*pa);//注意这里打印*pa的话只打印的是一个字符
    printf("访问数组里面的值还有别的方法,通过指针访问");
    printf("第一个:%c 第二个:%c  第三个:%c",*pa,*(pa+1),*(pa+2));
    return 0;
}

    那同理,既然数组名就类似一个指针,那我们可以直接用数组名作为指针访问元素,这种方法称为指针法。

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

int main()
{
    char str[250];
    char *pa=str;
   // pa=&str[0];或者用这种方法
    printf("请输入字符串:");
    scanf("%s",str);//注意,没有用到取址运算符&(只有字符串数组和指针scanf才不会用到&,因为他们的名字已经代表地址
    printf("%c\n",*pa);//注意这里打印*pa的话只打印的是一个字符
    printf("访问数组里面的值还有别的方法,通过指针访问");
    printf("第一个:%c 第二个:%c  第三个:%c",*str,*(str+1),*(str+2));//运用了指针法
    return 0;
}

7、既然数组名是一个指向数组第一个元素的指针,那我们可以直接定义指针存进一个一个字符串

     那就和数组一样了

     也就是说,指针定义字符串的话也可以用下标法

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

int main()
{
    char *pa="mengxiangjia";//既然数组名是一个指向数组第一个元素的指针,那我们可以直接定义指针存进一个一个字符串
    //那就和数组是一样的了
    int i,length;
    length=strlen(pa);
    for(i=0;i<length;i++)
    {
        printf("%c\n",pa[i]);//也就是说,指针定义字符串的话也可以用下标发
    }
    return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值