指针详解及应用总结

大家好啊,今天我来分享指针的基本使用方式,若有知识问题欢迎指正,继续和大家一起加油!!

一.指针简短概念:
一个变量的地址称为此变量的“指针”。也就是指针就是地址
系统在编译代码时就会给变量等程序中需要内存空间来存值的东西开辟内存空间,这个空间有地址,那就成为存入的东西的地址了
eg:
int a=0;
int *p=&a;(&a为整形变量a的取地址操作,利用此操作即为将变量a的地址赋值给指针变量p,利用p即可访问到变量a地址所存储的内容)

二.指针变量与指针常量:
以上提到了指针变量,现在来讲讲指针变量与指针常量。
1.指针常量:系统在编译时给变量分配的内存地址就称为此变量的“指针”,由于该内存空间为系统分配的,无法改变,故称之为指针常量,同理,数组的地址也是指针常量。
注意:地址可以用&来取出,并可以用格式占位符来进行输出,可以用%d十进制输出,用%p来十六进制输出,也可以用%o来八进制输出,不过我们一般用十六进制即%p输出
2.指针变量:
(1)概念:指针变量是一种存储变量地址的变量,和指针常量不同,指针变量存储的地址是可以改变的
(2)指针变量的定义:
一般格式:类型名 * 指针变量名;什么类型的指针就只可以指向什么类型的变量
(3)指针变量的引用:
第一种使用情况:
给指针变量赋值:即为给定义的指针变量存入变量的地址
eg:
int a=0;
int *p=&a;
第二种使用情况:
解引用:解引用(*p)即为将指向的地址的变量取出,相当于该变量,之后使用该变量即可了
eg:
int a=0;
int *p=&a;
*p=10;//即相当于a=10,即*p=a
printf("%d",*p);//输出的即为a改变之后的值
printf("%p",p);//输出的是指针变量p存储的地址,也就是变量a的地址

三.指针变量与函数
1.函数参数为指针类型(地址传递):
地址传递不同于值传递(说的是传参过程),地址传递可以通过形参来改变实参的值,而值传递不可以
eg:
代码:

#include<stdio.h>
void fun1(int x, int y) 
{   
    printf("x = % d\ty = % d\n", x++, y++); 
}
void fun2(int* x, int* y)
{   
    printf("x = % d\ty = % d\n",(*x)++, (*y)++);
}
int main()
{
    int a = 10, b = 20, * p, * q;
     fun2(&a,&b); //注意后自增是先使用变量之后再对变量加一
     p=&a; 
     q=&b; 
     printf("a = % d\tb = % d\n",*p, *q);
     fun2(p,q);
     printf("p = % d\tq = % d\n", *p, *q);//使用fun2传入变量a和b的地址后,两变量值改变了,这就是地址传递
     fun1(a, b);
     printf("a = % d\tb = % d\n", a, b);//使用fun1传入a,b两变量后,两变量值却未改变,这就是值传递
     return 0;
}


输出结果如下:
x =  10 y =  20
a =  11 b =  21
x =  11 y =  21
p =  12 q =  22
x =  12 y =  22
a =  12 b =  22

2.指针函数:
返回值为指针类型的函数称为“指针函数”。
指针函数的应用:
eg:
代码:

#include<stdio.h>
int* plus(int *p)
{
    p++;
    return p;
}
int main()
{
    int a = 0;
    printf("%p\n", &a);
    int* p = plus(&a);
    printf("%p", p);
    return 0;
}


输出结果如下:
00000013C094FA54
00000013C094FA58
以上代码实例使用了指针函数并且证明了指针的移动单位是指针基类型大小

四.通过指针引用数组
1.指向数组元素的指针
数组元素的地址表示方式:
eg:
int a[3]={1,2,3};
&a[1]即为数组第二个元素的地址,数组元素的地址是相连的,在物理存储上数组开辟的空间是连续的

2.指针指向数组元素
和变量方式一样
eg:
int a[3]={1,2,3},*P;
p=&a[2]//指针变量p指向数组元素a[2]的地址

3.指针的偏移:
如上面所说,指针的偏移单位是基类型大小
可以使用指针偏移来进行数组元素的连续输出:
代码:

#include<stdio.h>
int main()
{
    int a[4] = { 1,2,3,4 },*p;
    p = &a[0];
    for (int i = 0; i < 4; i++)
    {
        printf("%d ", *(p + i));
    }
    return 0;
}


输出结果:
1 2 3 4

4.利用指针直接指向字符串,默认指向的是存储该字符串的字符数组首地址
eg:
代码:

#include<stdio.h>
int main()
{
    char* p = "wsxh";
    puts(p);
    while (*p)//用于判断指针是否指向字符串结尾\0,\0相当于0
    {
        printf("%c ", *(p++));
    }
    return 0;
}


运行结果:
wsxh
w s x h

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值