• 《黑马程序员》 ★指针练习★ (C语言)


    指针的基本概念:

    重要性:

    如果你说C语言中除了指针,其他你都学得很好,那你干脆说没学过C语言。-----引用李明杰老师的一句话

    格式:

    变量类型  * 变量名            例:int *p;   作用:能够根据1个地址值访问并修改对对应的存储空间

    使用:

    代码联系1

    #include <stdio.h>
    int main()
    {
      int a = 80;              //定义一个整形变量a且赋值80;
      int *p;                  //定义一个int型指针变量*p
      p = &a;                  //取得变量a的地址并且赋给指针p
      *p = 10;                 //对p所指向的存储空间(也就是a)赋值
      printf("a = %d",a);      //输出变量a的值
      return 0;
    }
    运行结果:a = 10

     int *p中的*是指针的标志

    p = &a;    指针变量只能存储地址   

    int *p;     指针变量p前面定义了int,说明指针只能指向int 型数据

    代码练习2

    #include <stdio.h>
    //通过使用指针改变变量a的值
    int change(int *n)
    {
      *n = 10;                    //对n所指向的存储空间(也就是a)赋值
    }
    
    int main()
    {
      int a = 80;                //定义一个整形变量a且赋值80;
      change(&a);                //调用change函数,把变量a的地址送给change函数的形参
      printf("a = %d",a);        //输出变量a的值
      return 0;
    }
    
    运行结果:a = 10

    注:如果不利用指针则无法在change函数内修改main函数中变量a的值

     使用注意:

    int main()
    {
    	int *p;
    	double d = 3.2;
    	p = &d;                    // 错误原因:int *p只能指向int类型的数据
    
    	int *p;
    	p = 200;                   //错误原因:指针变量只能存储地址
    
    	int *p;
    	printf("%d
    ",*p);         //指针变量未经初始化,不能直接访问其他的存储空间
    
    	int *p;
    	*p = &a;                   //错误写法
    }
    

    指向指针的指针:

    int main()
    {
           int a = 20;               //定义并向a赋值
           int *p = &a;              //取得a的值并赋给指针p 
           int **pp = &p;            //取得p的值并赋给指针pp
           **pp = 30;                //对指针pp所指向的存储空间赋值
           printf("a = %d
    ",**pp);  //输出变量a的值
           return 0;
    }
    运行结果:a = 30
    

    注:指针在任何类型下都是占用8个字节

    二、指针和数组

    1.数组的访问方式:

    数组名【下标】           例:ages[i];

    指针变量名【下标】     例:p[i];  //前提是指针变量P指向数组

    例:int ages[3] = {41,52,95};

         int *p;

         p = ages;     // 数组名就是数组首元素的地址,此行代码表示把数组元素地址赋给指针p   

    使用指针遍历数组内各元素:

    2.指针变量的+1究竟地址会加几取决于指针变量的类型

    int *p                p+1相当于地址值+4;

    char *p             p+1相当于地址值+1;

    double *p          p+1相当于地址值+8;

    int main()
    {
    int ages[5] = {10,8,91,64,7}; int *p; p = &ages[0]; for(int i = 0;i <= 4;i++) { printf("ages[%d] = %d ",i,*(p+i)); } return 0; }
    运行结果:
    ages[0] = 10
    ages[1] = 8
    ages[2] = 91
    ages[3] = 64
    ages[4] = 7

     解析:指针p指向ages[0]    p+1则指向ages[1]

      三、指针与字符串  

    定义字符串的方式: 

    char s[] = "itcast";

    char *s = "itcast"       指针s指向字符串的首元素地址

    char *s;

    *s ="itcast" 

            char *buf = "it";//指针变量buf指向了字符串的首地址
    	printf("*buf = %c
    ",*buf);
    	printf("buf = %s
    ",buf);//
    

     运行结果: buf =i                 

                    buf =it             %s遇到才会停止

    返回指针的函数:

    类型名 函数名(参数列表)

    char *test();      代表函数返回char类型的数据

    #include <stdio.h>
    char *test();                             //函数声明
    int main()
    {
    	char *name =test();              //定义一个字符串并且调用指针函数
    	printf("name = %s
    ",name);      //输出字符串name内元素
    	return 0; 
    }
    char *test()
    {
    	return "rose";
    }
    

      

    指向函数的指针:

    函数的返回值类型 (*指针变量名)(形参1, 形参2, ...);

    #include <stdio.h>
    void test();
    int main()
    {
    	//(*p)是固定写法,代表指针变量p将来肯定指向函数
    	//左边的void ,代表变量p指向的函数没有函数值
    	//右边的():指针变量p指向的函数没有形参
    	void (*p)();
    	//指针变量p指向了test函数
    	p = test;     //把函数覅只赋给指针p
    	(*p)();       //简介调用函数test 
    	test();       //直接调用函数test
    	p();
    
    	return 0;
    }
    void test()
    {
    	return "rose";
    }
    

      

      

  • 相关阅读:
    xml转义字符在mybatis动态sql中的使用
    jdbc类型与java类型
    aop日志(记录方法调用日志)
    mysql数据库关联查询【lert join】常见使用
    maven项目基本配置
    mapper文件的参数传入与获取
    idea新建项目出现push rejected如何解决
    快速从2个List集合中找出相同/不同元素
    Windows 环境下安装RocketMQ
    RabbitMQ java客户端集成 Spring 开发环境
  • 原文地址:https://www.cnblogs.com/shtz/p/4420036.html
Copyright © 2020-2023  润新知