首页 > 其他分享 >学习C语言第五天

学习C语言第五天

时间:2023-04-03 23:46:28浏览次数:31  
标签:temp int C语言 学习 地址 第五天 include data 指针

一.指针

1.1 认识它  

1.2指针==地址

  int a = 10; 变量名能访问,通过地址也能访问

  &取地址运算符

  *将地址内的值读出运算符

1.3指针变量==存放地址的变量

  *的标识作用  只产生在指针变量定义或声明的时候

  *的运算作用

  变量访问的两种方式   直接访问
              间接访问

1.4既然指针变量是存放别人地址的变量,那为什么要区分类型呢 

  决定指向空间的大小

  决定增量

#include<stdio.h>

int main()
{        
    int a = 10;
    int *p;
    p = &a;
    printf("变量名访问a:%d\n",a);
    printf("a的地址是:0x%p\n",&a);
    printf("地址访问a:%d\n",*(&a));
    
    return 0;
}

1.5为什么需要用指针

1.5.1封装一个函数,实现两个数的交换

#include<stdio.h>

void chageData(int *pdata,int *pdata2)
{
    int temp;
    temp = *pdata;
    *pdata = *pdata2;
    *pdata2 = temp;
}

int main()
{        
    int data = 10;
    int data2 = 20;
    
    printf("交换前:data=%d,data2=%d\n",data,data2);
    chageData(&data,&data2);
    printf("交换后:data=%d,data2=%d\n",data,data2);
    
    return 0;
}

1.5.2.指针指向固定的区域

#include<stdio.h>

int main()
{        
    int data = 10;
    printf("data的地址为:0x%p\n",&data);
    
    int *p = (int *)0x000000000061FE1D;    //注意0x
    printf("p的地址为:%p\n",p);
    return 0;
}

1.5.3输入三个数a,b,c;要求不管怎么输入,在输出的时候,a,b,c就是由大到小的顺序输出,用函数封装实现

#include<stdio.h>

void threeMaxData(int *a,int *b,int *c)
{
    int temp;
    if(&a < &b){
        temp = *a;
        *a = *b;
        *b = temp;
    }
    
    if(&b < &c){
        temp = *b;
        *b = *c;
        *c = temp;
    }
        
    if(&a < &b){
        temp = *a;
        *a = *b;
        *b = temp;
    }
}

int main()
{        
    int a;
    int b;
    int c;
    puts("请输入a,b,c");
    scanf("%d%d%d",&a,&b,&c);
    
    threeMaxData(&a,&b,&c);
    
    printf("输出为:a=%d,b=%d,c=%d",a,b,c);
    
    return 0;
}

1.6通过指针引用数组

  定义一个指针变量指向数组
  int a[10]
  int *p ;
  p = &a[0];   //p = a

  指针增量和数组的关系

#include<stdio.h>

int main()
{    
    int arr[3] = {1,2,3};
    int *p;
    p = arr;    //数组名就是数组的首地址
    for(int i = 0;i<3;i++){
        printf("%d ",*(p+i));
    }
    return 0;
}

1.7通过指针引用数组的元素

  下标法
  指针法   1.偏移
        2.取内容 见怪不乖的数组名   a++可行否    常量指针
                             指针变量
                             sizeof的时候
                             取地址的时候

                    a+1呢?

#include<stdio.h>

int main()
{    
    int arr[3] = {1,2,3};
    int *p;
    p = arr;    //数组名就是数组的首地址
    for(int i = 0;i<3;i++){
        printf("%d ",*p++);
    }
    return 0;
}

  两种方法效率的对比,对于使用指针和数组下标的选择:系统在使用数组下标对数组成员变量进行访问时,开销比较大,指针的访问效率是远远大于数组名的访问效率的,但是只有在指针正确访问时,才成比下标法更有效率。下标法更加容易理解,在可读性方面,也更加的具有优势,具体怎么选择,也没有一定的说法。

1.8练习题

1.8.1函数封装数组初始化,遍历

#include<stdio.h>

void initArry(int *arr,int size)
{
    int i;
    for(i=0;i<size;i++){
        printf("请输入第%d个元素的数据:\n",i+1);
        scanf("%d",arr);
        arr++;
    }
}


void printArry(int *arr,int size)
{
    int i;
    for(i=0;i<size;i++){
        printf("%d ",*arr);
        arr++;
    }
}

int main()
{    
    int arry[5];
    int size = sizeof(arry)/sizeof(arry[0]);
    initArry(arry,size);
    printArry(arry,size);
    return 0;
}

1.8.2数组反转

#include<stdio.h>

void reverseArry(int *parry1,int *parry2,int len)
{
    int i;
    int j = 0;
    for(i=len-1;i>=0;i--){
        parry2[j] = parry1[i];
        j++;
    }
}

void printArry(int *parry2,int len)
{
    for(int i = 0;i<len;i++){
        printf("%d ",parry2[i]);
    }
    
}

int main()
{    
    int arr1[5] = {9,56,323,6,7};
    int len =  sizeof(arr1)/sizeof(arr1[0]);
    int arr2[len];
    
    reverseArry(arr1,arr2,len);
    
    printArry(arr2,len);
    return 0;
}

 

标签:temp,int,C语言,学习,地址,第五天,include,data,指针
From: https://www.cnblogs.com/Lynchteacher/p/17284928.html

相关文章

  • C语言逆向——指针
    指针类型在C语言里面指针是一种数据类型,是给编译看的,也就是说指针与int、char、数组、结构体是平级的,都是一个类型。带"*"号的变量我们称之为指针类型,例如:char*x;short*y;int*a;float*b;...任何类型都可以带这个符号,格式就是:类型*名称;星号可以是多个。指针变量......
  • C语言逆向——预处理之宏定义、条件编译与文件包含
    预处理之宏定义、条件编译与文件包含预处理一般是指在程序源代码被转换为二进制代码之前,由预处理器对程序源代码文本进行处理,处理后的结果再由编译器进一步编译。预处理功能主要包括宏定义、文件包含、条件编译三部分。宏定义简单的宏:#define标识符字符序列#defineFALS......
  • android下拉菜单 spinner 学习
    首先看一下继承关系:publicclassSpinnerextendsAbsSpinnerimplementsDialogInterface.OnClickListenerClassOverview视图在同一时间只能显示一个子项,用户通过下拉的方式可以选择其中的一种项。该子项在Spinner来自来Adpater视图适配器。首先看一下效果图:Spinner控件的使......
  • Flask学习笔记(2)--最简单的小应用
    Flask学习笔记(2)--最简单的小应用 新建一个flask项目,第一个小程序,我们来看一下fromflaskimportFlaskapp=Flask(__name__)@app.route('/')defhello_world():return'HelloWorld!'if__name__=='__main__':app.run() 1、引入flask类2、将Flask对象......
  • Flask 学习笔记(1)--环境安装
    Flask学习笔记(1)--环境安装Flask官网:http://flask.pocoo.org/Flask文档:http://docs.jinkan.org/docs/flask/0x01安装方式A、第一种安装步骤很简单,就是这个样子安装python安装flaskpipinstallflaskB、第二种:虚拟环境D:\test>pipinstallvirtualenv#安装vir......
  • Webgoat学习笔记
    Webgoat学习笔记Webgoat分为简单版和开发版,具体版本及安装方法详见:https://github.com/WebGoat/WebGoat本机环境为:Windows+Tomcat,故下载war包,自动解压缩进行部署。war下载地址:https://github.com/WebGoat/WebGoat/releases/    参考链接:Webgoat学习笔记:http://www.tui......
  • java学习日记20230404-String类
    String类String对象用于保存字符串,也就是一组字符序列;字符串常量对象使用双引号包括起来的字符序列字符串的字符使用unicode字符编码,一个字符(不区分字母还是汉字)占用两个字节String常用的构造器:newString();newString(Stringoriginal);newString(char[]a);newString(char[]......
  • python+playwright 学习-45 drag_to 拖拽操作
    前言按住元素从页面的一个位置拖动到另外一个位置,可以用drag_to()方法实现拖拽操作场景目标元素拖动到指定位置drag_to拖拽操作您可以使用locator.drag_to()执行拖放操作。此方法将:将鼠标悬停在要拖动的元素上。按鼠标左键。将鼠标移动到将接收放置的元素。松开鼠......
  • 【数据结构】二叉树先序、中序、后序及层次遍历(C语言版)
    一、图示展示1.先序遍历先序遍历可以想象为,一个小人从一棵二叉树根节点为起点,沿着二叉树外沿,逆时针走一圈回到根节点,路上遇到的元素顺序,就是先序遍历的结果先序遍历结果为:ABDHIEJCFKG动画演示:记住小人沿着外围跑一圈(直到跑回根节点),多看几次动图便能理解2.......
  • 学习python第二天
    流程控制一.顺序流程自上而下的顺序一条一条的执行代码。二.选择流程/分支流程1.1单分支ifif表达式:要执行的操作2.2双分支ifelseif表达式:要执行的操作else:否则要执行的操作2.3多分支ifelifelifelse条件表达式:三:循环流程while条件表达式: lie=9whileli......