学习C语言第五天

一.指针

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;
}
复制代码

 

posted @   林奇老师  阅读(31)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 如何使用 Uni-app 实现视频聊天(源码,支持安卓、iOS)
· C# 集成 DeepSeek 模型实现 AI 私有化(本地部署与 API 调用教程)
点击右上角即可分享
微信分享提示