我是靠谱客的博主 活力老师,最近开发中收集的这篇文章主要介绍C语言自学记录-Class9-指针(重点)-2-基本类型指针P124. 指针-2-基本类型指针,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

P124. 指针-2-基本类型指针

说明:

本篇记录的是自学C语言的相关过程记录,参考资料是B站郝斌老师的C语言自学教程。本人之前学过一点python,但是觉得C语言还是有必要学一下的。因为刚开始学C语言,所以本篇文章会不断更新。
因为是学习记录,所以条理可能并不是很清晰,后续感觉学的差不多的时候会重新整理一下。

指针的重要性:

  1. 表示一些复杂的数据结构;

  2. 快速地传递数据;

  3. 使函数返回一个以上的值(详情见最后);

  4. 能直接访问硬件;

  5. 能够方便地处理字符串;

  6. 是理解面向对象语言中引用的基础;

    总结:指针是 C 语言的灵魂。

指针的定义:

地址:

内存单元的编号。

从零开始的非负整数。

范围:4G(2009年)

指针:

指针就是地址,地址就是指针;

指针变量就是存放地址的变量;

指针的本质就是一个操作受限的非负整数(指针只能进行减法计算,不能进行加、乘、除);

指针和指针变量是不同的概念;

指针的分类1 —— 基本类型指针:

int * p;
int i = 3;
p = &i;

// int * p; 等价于 int *p; 也等价于 int* p;

p 保存 i 的地址

因此 p 指向 i

*p 就是 i

基本类型指针常见错误:

示例1:(更改了以垃圾值为地址的变量的值)

# include <stdio.h>

int main(void)
{
    int * p;
    int i = 5;

    *p = i; // error 以垃圾值为地址的变量赋值为i
    printf("%dn", *p);
    return 0;
}

/*
	p 没有初始化,所以 *p 指向的是以 垃圾值p(没有初始化,那么 p 就默认是垃圾值) 为地址的变量。
	因此 *p = i,就是说把 i 的值 赋给了 以 垃圾值p 为地址的变量。
*/

示例2(指针变量的类型和值的类型不一致、没有内存单元的控制权):

# include <stdio.h>

int main(void)
{
    int i = 5;
    int * p;
    int * q;

    p = &i;
    *q = p; //error 语法编译出错(数据类型不一致),*q类型为int, p的类型为 int *
    // *q = *p;  //那么该错误和示例1一样。
    // p = q; // 把p的值赋值为q的值,q的值是个垃圾值,所以p的值也是个垃圾值。
    printf("%dn", *q); 
    /* 
    	q 的空间是本程序的,所以可以读写q的内容。但是如果q是垃圾值,则本程序不能读写 *q 的内容。也就是说此处只能 printf("%dn", q); 而不能 printf("%dn", *q);
    	因为此时 *q 多代表的内存单元的控制权并没有分配给本程序。
	*/
    return 0;
}

/*
	普通变量 i 和 指针变量 p, q;
	i 的初始化值为5,i 的地址赋值给 指针变量p  --> *p = i
	q没有初始化,所以q是个垃圾值,所以 *q = p 就是把p的值(也就是 i 的地址) 赋值给 以垃圾值q为地址的变量。
	
	所犯错误和示例1类似,但是不太一样的地方是:上面编译不会出错,这里编译会出错,原因是:
		*q是q指向的变量,其类型为 int类型,而 p的类型为 int *,也就是说*q和p在类型上不一致,所以编译会出错。
*/

示例2:经典的指针程序(互换两个数字):

以下代码不能完成互换的功能:

# include <stdio.h>

void huhuan(int * p, int * q)
{
    int * t; 
    t = p;
    p = q;
    q = t;
    
    /*
        这里互换的是指针变量 p 和 q 的值,也就是说改变了 p 和 q 的指向;
        也就是说:
        	*p = x; *q = y;
        	换成了
        	*p = y; *q = x;
        其实 x 和 y 的值并没有被互换。
    */

    return;
}


int main(void)
{
    int a = 3;
    int b = 5;

    huhuan(&a, &b);
    printf("a = %d , b = %dn", a, b); // 因为 huhuan()没有实现两个形参的值之间的互换,所以a和b依旧是原来的a=3; b=5;

    return 0;
}

以下脚代码实现互换的功能:

# include <stdio.h>

void huhuan(int * p, int * q)
{
    int t;
    t = *p;
    *p = *q;
    *q = t;

    /*
        这里互换的是以指针变量的值为地址的变量的值,就是说:
        p指向a,q指向b,所以 *p 就是 a,*q 就是 b。
        也就是说:
            t = *p;
            *p = *q;
            *q = t;
        可以换成:
            t = a;
            a = b;
            b = t;
        需要注意的是由于 p 是 int * 类型,所以 *p 就是 int 类型。
        因为要保持数据类型的一致性,所以 t 的类型要和 *p *q 一致,因此 t 的类型是 int 类型。
    */

    return;
}


int main(void)
{
    int a = 3;
    int b = 5;

    huhuan(&a, &b);

    printf("a = %d , b = %dn", a, b);

    return 0;
}

*的含义:

  1. 乘法运算;

  2. 定义指针变量(例如:int * p);

    // 定义了一个名字为p的变量,int *表示p只能存放int类型变量的地址。

  3. 指针运算符;

    // 该运算符放在已经定义好的指针变量的前面。 如果p是一个已经定义好的指针变量,则*p表示 以p的内容为地址的变量。

指针使函数返回一个以上的值:

如何通过被调函数修改主调函数的普通变量的值?(或者说:如何让函数返回一个以上的值?)

  1. 实参必须为该普通变量的地址;
  2. 形参必须为指针变量;
  3. 在被调函数中通过 *形参名 = ...的方式来修改主调函数相关变量的值;
# include <stdio.h>

// 通过指针使函数返回一个以上的值。
void g(int * p, int * q)
{
    *p = 1;
    *q = 2;
}

int main(void)
{
    int a = 3, b = 5;
    g(&a, &b);
    printf("a = %d, b = %dn", a, b);
    return 0;
}

最后

以上就是活力老师为你收集整理的C语言自学记录-Class9-指针(重点)-2-基本类型指针P124. 指针-2-基本类型指针的全部内容,希望文章能够帮你解决C语言自学记录-Class9-指针(重点)-2-基本类型指针P124. 指针-2-基本类型指针所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(55)

评论列表共有 0 条评论

立即
投稿
返回
顶部