c语言指针理解

这篇具有很好参考价值的文章主要介绍了c语言指针理解。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

基本理解

#include <stdio.h>
#include <windows.h>
int main(){
    SetConsoleOutputCP(65001);
    int var=20;
    int p=var;
    printf("%d\n",var);
    printf("%d\n",p);
    printf("%p\n",&var);
    printf("%p\n",&p);
    return 0;
}

%p是指针的值的意思

c语言指针理解

  结果看 var和p的值虽然一样,但是两个变量是指向两个内存地址。

那如果改变var变量的值

#include <stdio.h>
#include <windows.h>
int main(){
    SetConsoleOutputCP(65001);
    int var=20;
    int p=var;
    printf("%d\n",var);
    printf("%d\n",p);
    printf("%p\n",&var);
    printf("%p\n",&p);
    printf("-------\n");
    var=11;
    printf("%d\n",var);
    printf("%d\n",p);
    printf("%p\n",&var);
    printf("%p\n",&p);
    return 0;
}

c语言指针理解

 可以看到var的值变了,p的值没变 而且两个变量的内存地址也不变,也就是说这只是一个简单的改变值得过程,如果你要想变量p根据var值变化而变化,那p就要指向var的内存地址

如下,看下下面的的代码理解下

#include <stdio.h>
#include <windows.h>
int main(){
    SetConsoleOutputCP(65001);
    int var=20;
    int *p;
    p=&var;
    printf("%d\n",var);
    printf("%d\n",*p);
    printf("%p\n",&var);
    printf("%p\n",p);
    printf("-------\n");
    var=11;
    printf("%d\n",var);
    printf("%d\n",*p);
    printf("%p\n",&var);
    printf("%p\n",p);
    return 0;
}

c语言指针理解

var 是( 值 | 地址 ) 就是  ( 20 | &var)

*p是指针变量,指向 var的地址,相对于var 以p来表达就是( *p | p)就是( 值 | 地址 )

指针算数运算

#include <stdio.h>
#include <windows.h>
int main(){
    SetConsoleOutputCP(65001);
    int var[]={10,100,200};
    int *ptr;
    ptr=&var[0];// 也可以是ptr=var
    for(int i=0;i<3;i++){
        printf("var[%d]值:%d\n",i,*ptr);
        printf("var[%d]地址:%p\n",i,ptr);
        ptr++;
    }
    return 0;
}

c语言指针理解

指针数组

#include <stdio.h>
#include <windows.h>
#define MAX 3
int main(){
    SetConsoleOutputCP(65001);
    int var[MAX]={10,100,200};
    int *ptr[MAX];
    for(int i=MAX-1;i>=0;i--){
        ptr[i]=&var[i];
        printf("%d\n",*ptr[i]);
    }
    return 0;
}

c语言指针理解

 字符串数组指针

#include <stdio.h>
#include <windows.h>
#define MAX 3
int main(){
    SetConsoleOutputCP(65001);
    char *name[]={
        "小白",
        "小红",
        "小明"
    };
    for(int i=MAX-1;i>=0;i--){
        // printf("%s\n",name[i]);
        puts(name[i]);
    }
}

指向指针的指针

#include <stdio.h>
#include <windows.h>
#define MAX 3
int main(){
    SetConsoleOutputCP(65001);
    int a=1;
    int *b,**c;
    b=&a;
    c=&b;
    printf("%d\n",a);
    printf("%d\n",*b);
    printf("%d\n",**c);
    printf("%p\n",&a);
    printf("%p\n",b);
    printf("%p\n",c);
}

c语言指针理解

传递指针给函数

指针作为参数的函数

#include <stdio.h>
#include <windows.h>
void countFun(int *s){
    *s=1;
}
int main(){
    SetConsoleOutputCP(65001);
    int size=0;
    countFun(&size);
    printf("%d",size);
}

c语言指针理解

指针作为参数的函数,也能接受数组作为参数

#include <stdio.h>
#include <windows.h>

double avg(int *arr,int size){
    int count=0;
    for(int i=0;i<size;i++){
        count+=arr[i];
    };
    double avgVal=(double)count/size;
    return avgVal;
}
int main(){
    SetConsoleOutputCP(65001);
    int arr[]={1,2,3,4,5,6};
    int size=sizeof(arr)/sizeof(arr[0]);
    double avgVal=avg(arr,size);
    printf("%d",avgVal);
}

c语言指针理解

 函数返回指针

函数内要return 必须 用statci定义静态变量C/C++ 中 static 的用法全局变量与局部变量 | 菜鸟教程

#include <stdio.h>
#include <time.h>
#include <stdlib.h> 
 
/* 要生成和返回随机数的函数 */
int * getRandom( )
{
   static int r[10];
   srand((unsigned) time(NULL));
   for(int i=0;i<10;i++){
    r[i]=rand()%10;
    printf("%d\n",r[i]);
   }
   return r;
}
 
/* 要调用上面定义函数的主函数 */
int main ()
{
    int *p;
    p=getRandom();
    printf("\n-------\n");
    for(int i=0;i<10;i++){
        printf("%d\n",*(p+i));
    }
    return 0;
}

c语言指针理解

函数指针

例如下面是正常的函数

#include <windows.h>
#include <stdio.h>
int cyc1(int x,int y){
   return x>y?x:y;
}
int main(void){
    SetConsoleOutputCP(65001);
    int a,b,c;
    printf("请输入3个整数:");
    scanf("%d %d %d",&a,&b,&c);
    int val=cyc1(cyc1(a,b),c);
    printf("%d",val);
    return 0;
}

然后用函数指针文章来源地址https://www.toymoban.com/news/detail-411481.html

#include <windows.h>
#include <stdio.h>
int cyc1(int x,int y){
   return x>y?x:y;
}
int main(void){
    SetConsoleOutputCP(65001);
    int a,b,c;
    int (*p)(int,int)=&cyc1;
    printf("请输入3个整数:");
    scanf("%d %d %d",&a,&b,&c);
    int val=p(p(a,b),c);
    printf("%d",val);
    return 0;
}

到了这里,关于c语言指针理解的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • C语言——深入理解指针

    实数组名就是数组⾸元素(第⼀个元素)的地址,但是有两个例外: • sizeof(数组名) ,sizeof中单独放数组名,这⾥的数组名表⽰ 整个数组 ,计算的是整个数组的⼤⼩,单位是字节 • 数组名 ,这⾥的数组名表⽰整个数组, 取出的是整个数组的地址 (整个数组的地址和数组⾸

    2024年04月10日
    浏览(43)
  • 深入理解指针(c语言)

    可以使用指针来访问数组元素。例如,可以声明一个指针变量并将其指向数组的第一个元素,然后通过递增指针的方式来访问数组的其他元素: 输出结果: 在C语言中, 数组名有时代表数组中首元素的地址,有时代表整个数组 ,视情况而定。 1、数组首元素的地址 例1: 定义

    2024年02月22日
    浏览(37)
  • C语言——深入理解指针(3)

    目录 1. 字符指针 2. 数组指针 2.1 数组指针变量 2.2 数组指针变量的初始化 3.二维数组传参(本质) 4. 函数指针 4.1 函数指针变量的创建 4.2 函数指针的使用 4.3 typedef  5. 函数指针数组 6. 转移表(函数指针数组的使用) 在指针的类型中有一种指针类型为字符指针  char*    举例

    2024年02月05日
    浏览(54)
  • 【C语言:深入理解指针二】

    我们知道,指针变量也是变量,它也有自己的地址,使用什么来存放它的地址呢?答案是:二级指针。 关于二级指针的运算 *pp先解引用,对pp中的地址进行访问,访问的就是p **pp, 先通过*pp找到p,再对p进行解引用,访问的就是a 指针数组,顾名思义,它应该是一个数组,是用

    2024年02月04日
    浏览(106)
  • C语言深入理解指针(非常详细)(二)

    指针的基本运算有三种,分别是: • 指针±整数 • 指针-指针 • 指针的关系运算 因为数组在内存中是连续存放的,比如int类型的数组,每个元素相差4个字节,因此我们只需要知道首元素的地址就可以通过加减的方式找到后面元素的地址 。 概念:野指针就是指针指向的位置

    2024年02月10日
    浏览(41)
  • C语言深入理解指针(非常详细)(一)

    在将内存和地址时我们先举一个生活中的例子: 假设有⼀栋宿舍楼,把你放在楼里,楼上有100个房间,但是房间没有编号,你的⼀个朋友来找你玩, 如果想找到你,就得挨个房子去找,这样效率很低,但是我们如果根据楼层和楼层的房间的情况,给每个房间编上号,如: 有

    2024年02月10日
    浏览(37)
  • C语言深入理解指针(非常详细)(四)

    字符指针在之前我们有提到过,(字符)(指针)前面的字符代表着存储的元素为字符类型,而指针则是表示这存储的方式。 写法为char * 一般使用的方式如下: 还有一种使用方式如下: 值得注意的是: 代码 const char pstr = “hello jack.”; 特别容易以为是把字符串 hello jack 放到

    2024年02月09日
    浏览(53)
  • 【C语言基础】:深入理解指针(三)

    指针系列回顾 : 【C语言基础】:深入理解指针(一) 【C语言基础】:深入理解指针(二) 一、冒泡排序 冒泡排序的核心思想就是:两两相邻的元素进行比较。 可以看到,这段代码对arr数组进行了排序,但这个代码还有一些缺陷,那就是无论数组内部的元素是否有序,他都会循

    2024年03月10日
    浏览(40)
  • C语言——从头开始——深入理解指针(1)

     一.内存和地址 我们知道计算上CPU(中央处理器)在处理数据的时候,是通过地址总线把需要的数据从内存中读取的,后通过数据总线把处理后的数据放回内存中。如下图所示: 计算机把内存划分为⼀个个的 内存单元 ,每个内存单元的大小取1个字节( 1个字节(Byte)=8个比特

    2024年02月21日
    浏览(44)
  • 【C语言】指针的入门篇2,深入理解指针和数组的关系

    欢迎来CILMY23的博客喔,本期系列为【C语言】指针的入门篇2,深入理解指针和数组的关系,图文讲解指针和数组关系的知识,带大家理解指针和数组的关系,以及指针+数组的用法,感谢观看,支持的可以给个赞哇。 前言 在上一篇博客中,我们了解了指针就是地址,并且把地

    2024年02月20日
    浏览(46)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包