指针详解及应用总结

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

指针详解及应用总结_第1张图片

一.指针简短概念:
一个变量的地址称为此变量的“指针”。也就是指针就是地址
系统在编译代码时就会给变量等程序中需要内存空间来存值的东西开辟内存空间,这个空间有地址,那就成为存入的东西的地址了
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
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
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
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
int main()
{
    char* p = "wsxh";
    puts(p);
    while (*p)//用于判断指针是否指向字符串结尾\0,\0相当于0
    {
        printf("%c ", *(p++));
    }
    return 0;
}


运行结果:
wsxh
w s x h

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