C语言:变量指针、指针变量与数组指针、指针数组

14-C语言:第14天笔记 本文总结了C语言指针相关的重要知识点,包括变量指针与指针变量的区别、指针运算符(&和*)的使用、指针变量的指向特性以及指针运算规则。重点讲解了指针变量作为函数参数时的两种交换方式(交换指向和交换数据),以及指针变量与数组元素的关联,包括数组名的指针特性、指针运算在数组中的具体应用(自增/减、加减整数、指针相减/比较等)。通过代码示例演示了如何使用指针遍历数组,强调了指针运算只能在同数组内进行元素偏移的特性。 阅读详情

内容提要

  • 指针

    • 变量指针与指针变量

      • 指针变量做函数参数

      • 指针变量指向数组元素

    • 数组指针与指针数组

      • 数组指针

回顾

变量指针与指针变量

变量指针:变量的地址值(首地址),本质是指针、地址

指针变量:存储指针的变量,本质是变量

指针操作的两个运算符

&:取地址运算符,作用是获取指定对象的地址

*:指针操作符,如果这个符号前面有数据类型,就被称作声明指针;如果没有,就被称作解引用

关于指针中指向的问题

 int a = 10;
 int *p = &a   // 指针变量p指向对象a

指向:指针变量存储了谁的地址,这个指针变量就指向了谁!

使用间接操作,如何交换a和b的值

  1. 交换指向:指向发生改变,指向对象的数据不会改变

  2. 交换数据:指向不发生改变,指向对象的数据会改变

关于指针变量

指针变量本质上还是变量,只不过指针变量只能存储其他内存单元的地址,我们借助于指针变量,可以实现内存空间的共享。

关于共享

  1. 共享他人的空间

     int a = 10;
     int *p = &a;
     int *q = p;  // p和q共享a的空间
  2. 共享自己的空间

     int a = 10;
     int *p = &a;  // a和p共享a的空间

指针

变量指针与指针变量

指针变量做函数参数

指针变量做函数参数往往传递的是变量的首地址,借助于指针变量间接访问是可以修改实参变量数据的。

指针有一个作用就是,通过形参修改实参,我们将这样的参数称之为输出型参数。

案例

需求:有a,b两个变量,要求交换后输出,使用函数处理,用指针变量做函数的参数

  • 方式1:交换指向(指针指向改变,指向对象的数据不变)

    代码:

     
    
    /*************************************************************************
       > File Name:    demo01.c
       > Author:       三道渊
       > Description:  
       > Created Time: 2025年07月25日 星期五 09时29分02秒
      ************************************************************************/
     ​
     #include <stdio.h>
     ​
     /**
      * 方式1:交换指向
      */ 
     void swap(int *p_a, int *p_b)
     {
         int *p_t;
     ​
         // 交换
         p_t = p_a;
         p_a = p_b;
         p_b = p_t;
     ​
         printf("交换后:%d,%d\n",*p_a, *p_b); // 交换后:4,3
     }
     ​
     int main(int argc,char *argv[])
     {
         int a = 3, b = 4;
         printf("交换前:%d,%d\n", a, b);// 交换前:3,4
     ​
         swap(&a, &b);  // 传参的过程可以理解:int *p_a = &a, int *p_b = &b;
     ​
         return 0;
     }
    
    
  • 方式2:交换数据(指针指向不变,指向对象的数据改变)

    代码:

     /*************************************************************************
       > File Name:    demo01.c
       > Author:       三道渊
       > Description:  
       > Created Time: 2025年07月25日 星期五 09时29分02秒
      ************************************************************************/
     ​
     #include <stdio.h>
     ​
     /**
      * 方式2:交换数据
      */ 
     void swap(int *p_a, int *p_b)
     {
         int temp;
     ​
         // 交换
         temp = *p_a;
         *p_a = *p_b;  // 将p_b指向对象的值赋给p_a指向的对象
         *p_b = temp;  // p_b:访问指针变量的空间,*p_b:访问指针指向对象的空间
     ​
         printf("交换后:%d,%d\n",*p_a, *p_b); // 交换后:4,3
     }
     ​
     int main(int argc,char *argv[])
     {
         int a = 3, b = 4;
         printf("交换前:%d,%d\n", a, b);// 交换前:3,4
     ​
         swap(&a, &b);  // 传参的过程可以理解:int *p_a = &a, int *p_b = &b;
     ​
         return 0;
     }
     ​

指针变量指向数组元素【重难点】
数组元素的指针
  • 数组的指针就是数组中第一个元素的地址,也就是数组的首地址。

  • 数组元素的指针是指数组的首地址。因此,同样可以用指针变量来指向数组或者数组元素。

  • 在C语言中,由于数组名代表数组的首地址,因此数组名实际上也是指针。访问数组名就是访问数组首地址。

范例:

/*************************************************************************
   > File Name:    demo02.c
   > Author:       三道渊
   > Description:  
   > Created Time: 2025年07月25日 星期五 09时58分34秒
  ************************************************************************/
 ​
 #include <stdio.h>
 ​
 int main(int argc,char *argv[])
 {
     // 创建一个数组
     int arr[] = {11,22,33};
 ​
     int *p1 = &arr[0];  // 指针变量指向数组arr第一个元素,指针的范围就是数组元素
     int *p2 = arr;      // 等价于上面写法,数组名默认就是一个指向首元素地址的指针,推荐
 ​
     printf("%p,%p,%p\n", p1, p2, arr);  // 0x7ffe33135e2c,0x7ffe33135e2c,0x7ffe33135e2c
     
     return 0;
 }

注意:虽然我们定义了一个指针变量接收了数组地址,但不能理解为指针变量指向了数组,而应该理解为指向来了数组的元素(默认为第1个元素)。

指针的运算

指针运算:前提是指针变量必须要指向数组的某个元素。(指针运算只能在同一数组内进行,并且只能是元素之间的偏移)

序号指针运算偏移量说明
1自增:p++、++p、p+=1sizeof(type)指向下一个元素的首地址 需边界检测,防止越界
2自减:p--、--p、p-=1sizeof(type)指向上一个元素的首地址 需边界检测,防止越界
3加n个数:p+nn * sizeof(type)指向后面n个元素的首地址 需边界检测,防止越界
4减n个数:p-nn * sizeof(type)指向前面n个元素的首地址 需边界检测,防止越界
5指针相减:p1 - p2|(p1 - p2)| / typep1,p2 之间相差几个元素
6指针比较:p1 < p2逻辑值:真(1),假(0)前面的指针小于后面的指针

注意:

  • 上面表格中的type,是指针指向数组的元素的类型

  • sizeof不支持运算,举例:

     /*************************************************************************
       > File Name:    demo03.c
       > Author:       三道渊
       > Description:  
       > Created Time: 2025年07月25日 星期五 10时47分12秒
      ************************************************************************/
     ​
     #include <stdio.h>
     ​
     int main(int argc,char *argv[])
     {
         int a = 10;
     ​
         printf("sizeof(a)=%lu,sizeof(int)=%lu,sizeof(++a)=%lu\n", sizeof(a), sizeof(int), sizeof(++a)); // sizeof(a)=4,sizeof(int)=4,sizeof(a++)=4
     ​
         return 0;
     }

    说明:

    ① 如果指针变量p已指向数组中的一个元素,则p+1指向同一数组中的 下一个元素,p-1指向同一数组中的上一个元素。即p+1或p-1也表示地址。但要注意的是,虽然指针变量p中存放的是地址,但p+1并不表示该地址加1,而表示在原地址的基础上加了该数据类型所占的字节数d(d = sizeof(数据类型)) 。

    ② 如果p原来指向a[0],执行++p后p的值改变了,在p的原值基础上加d,这样p就指向数组的下一个元素a[1]。d是数组元素占的字节数。

    ③ 如果p的初值为&a[0]则p+i 和a+i 就是数组元素a[i]的地址,或者说,它们指向a数组的第 i 个元素 。

    ④ *(p+i)或*(a+i)是p+i或a+i所指向的数组元素,即a[i]。

    ⑤ 如果指针变量p1和p2都指向同一数组,如执行p2-p1,结果是两个地址之差除以数组元素的长度d。

案例
 
/*************************************************************************
   > File Name:    demo04.c
   > Author:       三道渊
   > Description:  
   > Created Time: 2025年07月25日 星期五 10时59分58秒
  ************************************************************************/
 ​
 #include <stdio.h>
 #include <math.h>
 ​
 int main(int argc,char *argv[])
 {
     // 创建一个用来实现指针运算的数组
     int arr[] = {11,22,33,44,55};
 ​
     int *p1 = arr + 4;  // 55 等价于 arr[4]
     int *p2 = arr + 1;  // 22 等价于 arr[1]
 ​
     size_t size = fabs(p2 - p1); // 3 = fabs(22对应的地址 - 55对应的地址) / int的字节数
 ​
     printf("*p1=%d,*p2=%d,size=%lu,&arr[1]+2=%d\n", *p1, *p2, size, *(&arr[1]+2));
 ​
     return 0;
 }
 ​

运行结果:

案例
  • 需求:通过下标法和指针法遍历数组

  • 代码:

     /*************************************************************************
       > File Name:    demo05.c
       > Author:       三道渊
       > Description:  
       > Created Time: 2025年07月25日 星期五 11时14分45秒
      ************************************************************************/
     ​
     #include <stdio.h>
     ​
     /**
      * 下标法遍历数组
      */ 
     void arr1(int arr[], int len) // 数组作为函数参数,传递的是数组的首地址(数组被降级为指针)
     {
         for (register int i = 0; i < len; i++) printf("%-4d", arr[i]);
         printf("\n");
     }
     ​
     /**
      * 指针法遍历数组
      */ 
     void arr2(int arr[], int len)
     {
         // 创建一个指针变量,接收数组,此时实际上接收到的是数组中第一个元素的地址
         int *p = arr;
     ​
         for (register int i = 0; i < len; i++) printf("%-4d",/* *(arr+i) 等价于*/ *(p+i));
         printf("\n");
     }
     ​
     /**
      * 指针法遍历数组
      */ 
     void arr3(int arr[], int len)
     {
         int *p = arr;
     ​
         for (register int i = 0; i < len; i++)
         {
             printf("%-4d", *p);
             p++;
         }
         printf("\n");
     }
     ​
     /**
      * 指针法遍历数组
      */ 
     void arr4(int arr[], int len)
     {
         int *p = arr;
     ​
         for(; p < arr + len; p++) // 判断的时候不能写作 p + len,因为p在变化,而arr没有变化
         {
             printf("%-4d", *p);
         }
         printf("\n");
     }
     ​
     int main(int argc,char *argv[])
     {
         int arr[] = {11,22,33,44,55};
         int len = sizeof(arr) / sizeof(arr[0]);
     ​
         arr1(arr, len);
         arr2(arr, len);
         arr3(arr, len);
         arr4(arr, len);
     ​
         return 0;
     }
     ​

案例
  • 需求:推导以下代码的运行结果

  • 代码:

     /*************************************************************************
       > File Name:    demo05.c
       > Author:       三道渊
       > Description:  
       > Created Time: 2025年05月20日 星期二 11时15分21秒
      ************************************************************************/
     ​
     #include <stdio.h>
     ​
     int arr2()
     {
         // 创建一个普通数组
         int arr[] = {11,22,33,44,55,66,77,88};
         
         int *p = arr;
         printf("%d\n", *p);  // 11
         
         p++;  // 指针偏移 1 * sizeof(int) 指针移动到22这个位置
         printf("%d\n", *p);  // 22
         
         int x = *p++;  // 第1步:解引用p的值赋值给x, x = 22; 第2步:p++,指针移动到33这个位置
         printf("%d,%d\n", x, *p);// 22,33
         
         int y = *(++p);// 第1步:++p,指针偏移到44这个位置;第2步:对44这个地址解引用,得到44
         printf("%d,%d\n", y, *p);// 44,44
         
         (*p)++;        // 第1步:对p解引用得到44;第2步:对44这个值+1,得到45
         printf("%d\n",*p); // 45
     }

※小贴士:

*p++:先解引用p,然后p这个指针自增(指针自增)

 int arr[] = {11,22,33}, *p = arr;
 int x = *p++; // x=11,*p=22   ① *p解引用,其实就是将指向的对象a的值赋值给x ② 指针p++,也就是指针偏移一位

(*p)++:先解引用p,然后使用解引用出来的数据自增(数值自增)

 int arr[] = {11,22,33}, *p = arr;
 int x = (*p)++; // x=11,*p=12   ① *p解引用,其实就是将指向的对象a的值赋值给x ② 解引用出来的对象数据自增
通过指针引用数组元素

引用一个数组元素,可以用:

① 下标法:如arr[i]

② 指针法:如*(arr + 1) 或者*(p+i)。其中arr是数组名,p是指向数组元素的指针变量,其初始值:p = arr;

案例

需求:

  • 下标法:(通过改变下标输出所有元素)

     #include <stdio.h>
     ​
     int main()
     {
         int arr[10], i;
         
         // 给数组元素赋值
         for (i = 0; i < 10; i++) scanf("%d", &arr[i]);
         
         // 遍历数组元素
         for (i = 0; i < 10; i++) printf("%-4d", arr[i]);
         
         printf("\n");
         return 0;
     }

  • 指针法(地址):(通过数组名计算出数组元素的地址,找出数组元素值)

     #include <stdio.h>
     ​
     int main()
     {
         int arr[10], i;
         
         // 给数组元素赋值
         for (i = 0; i < 10; i++) scanf("%d", &arr[i]);
         
         // 遍历数组元素
         for (i = 0; i < 10; i++) printf("%-4d", *(arr + i));   
         
         printf("\n");
         return 0;
     }

  • 指针法(指针变量):(用指针变量指向数组元素)

     #include <stdio.h>
     ​
     int main()
     {
         int arr[10], i, *p;
         
         // 给数组元素赋值
         for (i = 0; i < 10; i++) scanf("%d", &arr[i]);
         
         // 遍历数组元素
         for (p = arr; p < (arr + 10); p++) printf("%-4d", *p);
         
         printf("\n");
         return 0;
     }

    注意:数组一旦创建,就无法改变其值。

    以上3种写法比较:

    • 第①种写法和第②种写法执行效率相同。系统是将arr[i]转换为*(arr+i)处理的,即先计算出地址,因此比较费时。

    • 第③种方法比第①②种方法快。用指针变量直接指向数组元素,不必每次都重新计算地址。(p++)能大大提高执行效率。

    • 用第①种写法比较直观,而用地址法或者指针变量的方法难以很快判断出当前处理的元素。

    使用指针变量指向数组元素时(上面第③种写法),注意以下前两点:

    ① *(p--) 相当于arr[i--],先*p,再p--; *(p++) 相当于arr[i++],先*p,再p++;

    ② *(--p) 相当于arr[--i],先--p,再* *(++p) 相当于arr[++i],先++p,再*;

    ③ *p++ 先*p,再p++

    ④ (*p)++ 先*p,再*p++

    具体关系参照下面表格:

    操作类型指针表达式数组下标等价执行顺序指针移动方向是否改变指针地址
    前置自减+取值*(--p)arr[--i]1. 指针前移 2. 取新地址的值向前(←)√
    前置自加+取值*(++p)arr[++i]1. 指针后移 2. 取新地址的值向后(→)√
    后置自减+取值*(p--)arr[i--]1. 取原地址的值 2. 指针前移向前(←)√
    后置自加+取值*(p++)arr[i++]1. 取原地址的值 2. 指针后移向后(→)√
    后置自减(简写)*p--arr[i--]1. 取原地址的值 2. 指针前移向前(←)√
    后置自加(简写)*p++arr[i++]1. 取原地址的值 2. 指针后移向后(→)√
    取值后值自减(*p)--arr[i]--1. 取原地址的值 2. 值-1不移动×
    取值后值自加(*p)++arr[i]++1. 取原地址的值 2. 值+1不移动×
数组名作函数参数

① 形参和实参都是数组名

 
// arr 数组 形参
 void fun(int arr[], int len){..}
 ​
 void main()
 {
     int arr[] = {11,22,33};
     int len = sizeof(arr) / sizeof(arr[0]);
     // arr 数组 实参
     fun(arr, len);
 }

② 实参用数组名,形参用指针变量

 // arr 指针 形参
 void fun(int *arr, int len){..}
 ​
 void main()
 {
     int arr[] = {11,22,33};
     int len = sizeof(arr) / sizeof(arr[0]);
     // arr 数组 实参
     fun(arr, len);
 }

③ 实参和形参都用指针变量

 // arr 指针 形参
 void fun(int *arr, int len){..}
 ​
 void main()
 {
     int arr[] = {11,22,33};
     int len = sizeof(arr) / sizeof(arr[0]);
     // arr 指针 实参
     int *p = arr;
     fun(p, len);
 }

④ 实参用指针,形参用数组名

 // arr 数组 形参
 void fun(int arr[], int len){..}
 ​
 void main()
 {
     int arr[] = {11,22,33};
     int len = sizeof(arr) / sizeof(arr[0]);
     // arr 指针 实参
     int *p = arr;
     fun(p, len);
 }
案例:

需求:将数组a中的n个整数按相反顺序存放(数组反转)

分析:

代码:

 /*************************************************************************
   > File Name:    demo06.c
   > Author:       三道渊
   > Description:  
   > Created Time: 2025年07月25日 星期五 15时23分18秒
  ************************************************************************/
 ​
 #include <stdio.h>
 ​
 /**
  * 数组的反转:下标法
  */ 
 void inv1(int arr[], int len)
 {
     // 反转思路:第0个和最后一个交换,第1个和倒数第二个交换...
     // 定义循环变量和临时变量
     register int i = 0, temp;
 ​
     // 遍历数组
     for (; i < len/2; i++)
     {
         temp = arr[i];
         arr[i] = arr[len-1-i];
         arr[len-1-i] = temp;
     }
 }
 ​
 /**
  * 数组的反转:指针法
  */ 
 void inv2(int *p, int len)
 {
     // 反转思路:第0个和最后一个交换,第1个和倒数第二个交换...
     // 定义循环变量和临时变量
     int *i = p, *j = p + len - 1, temp;
 ​
     // 遍历数组
     for (; i < j; i++, j--)
     {
         temp = *i;
         *i = *j;
         *j = temp;
     }
 }
 ​
 /**
  * 遍历数组
  */ 
 void list(const int *arr, int len)  // const int *arr = arr;
 {
     const int *p = arr; // 添加const之后,指针指向对象的值不变,指针指向可以改变
 ​
     for (; p < arr + len; p++) printf("%-4d", *p); printf("\n");
 }
 ​
 ​
 int main(int argc,char *argv[])
 {
     int arr[] = {11,12,13,14,15};
     int len = sizeof(arr) / sizeof(arr[0]);
 ​
     list(arr, len);
     inv1(arr, len);
     list(arr, len);
     inv2(arr, len);
     list(arr, len);
 ​
     return 0;
 }

数组指针与指针数组

数组指针
定义

概念:数组指针是指向数组的指针(指针变量),本质上还是指针。

指针变量指向数组元素和数组指针的区别?

特点:

① 先有数组,再有指针

② 它指向的是一个完整的数组

一维数组指针

语法:

 数据类型 (*指针变量名)[容量];

案例:

/*************************************************************************
   > File Name:    demo07.c
   > Author:       三道渊
   > Description:  
   > Created Time: 2025年07月25日 星期五 15时59分29秒
  ************************************************************************/
 ​
 #include <stdio.h>
 ​
 int main(int argc,char *argv[])
 {
     // 一维数组指针
     int arr[] = {100,200,300};
 ​
     int len = sizeof(arr) / sizeof(arr[0]);
 ​
     // 定义一个数组指针(一维数组指针)
     int (*p)[len] = &arr; // arr默认指向数组元素,&arr指向整个数组,需要注意的的是,它们表示的范围不同,地址相同
 ​
     // p++:此时不能p++,否则会越界
     printf("&arr=%p,arr=%p,&arr[0]=%p\n", &arr, arr, &arr[0]); // arr 等价于 &arr[0]
 ​
     // 如何访问数组指针
     printf("%d\n", (*p)[2]); // 300
     // 遍历数组指针
     for (int i = 0; i < len; i++) printf("%-6d", (*p)[i]); printf("\n");
 ​
     return 0;
 }

我们之前所学的是指向数组元素的指针,本质上是指针变量;现在我们学的是指向数组的指针,叫作数组指针。

二维数组指针

语法:

 数据类型 (*指针变量名)[行容量][列容量];

案例:

  • 写法1:二维数组指针指向二维数组【不推荐】

    /*************************************************************************
       > File Name:    demo08.c
       > Author:       三道渊
       > Description:  
       > Created Time: 2025年07月25日 星期五 16时17分12秒
      ************************************************************************/
     ​
     #include <stdio.h>
     ​
     int main(int argc,char *argv[])
     {
         // 创建一个二维数组
         int arr[][3] = {10,20,30,100,200,300,1000,2000,3000};
     ​
         // 定义一个二维数组指针指向二维数组
         int (*p)[][3] = &arr;
     ​
         // 遍历数组
         for (int i = 0; i < 3; i++)
         {
             for (int j = 0; j < 3; j++)
             {
                 printf("%-6d", (*p)[i][j]);
             }
         }
         printf("\n");
     ​
         return 0;
     }
    
    
  • 写法2:一维数组指针指向二维数组【推荐】

    /*************************************************************************
       > File Name:    demo08.c
       > Author:       三道渊
       > Description:  
       > Created Time: 2025年07月25日 星期五 16时17分12秒
      ************************************************************************/
     ​
     #include <stdio.h>
     ​
     int main(int argc,char *argv[])
     {
         // 创建一个二维数组
         int arr[][3] = {10,20,30,100,200,300,1000,2000,3000};
     ​
         // 定义一个一维数组指针指向二维数组,相当于指针指向的是二维数组的行 [行容量]
         int (*p)[3] = arr; // 等价于 &arr[0] (*p):指向数组的行   int arr[] = {100, 200, 300}; int *p = arr;  解引用p 得到第一个元素
     ​
         // 遍历数组
         for (int i = 0; i < 3; i++)
         {
             for (int j = 0; j < 3; j++)
             {
                 printf("%-6d", p[i][j]);
                 // printf("%-6d", *(*(p+i)+j));
                 // printf("%-6d", (*(p+i))[j]);
                 // printf("%-6d", *(p[i]+j));
             }
         }
         printf("\n");
     ​
         return 0;
     }
     ​
gdb调试&C语言指针高级编程(5.7) GCC编译器简介: 一、基本知识了解      GCC是由gun之父Stallman所开发的linux下的编译器。全程为GNU C Complier (GNU c语言编译器)。这是一种早期的说法,早期的时候,它只是用来编译我们的C 语言,之后可以多个我们的多门语言都可以进行编译。例如, C,C++,JAVA,ObjectC等等。 GCC是可以在多种硬体平台上编译出可执行程序的超级编译器, 阅读详情

相关推荐

【C语言指针数组】——指向指针的指针

因此,在处理更复杂的程序时,应该谨慎使用它们。但是在某些情况下,它们可以帮助我们更高效地处理数据和内存。指针数组是一个数组,其元素都是指针。每个元素都可以指向另一个指针或变量。在声明指针数组时,需要使用星号(*)来指定元素类型为指针。在C语言中,我们可以使用指针来处理数组。但有时候,我们需要处理的数组本身是指针。指针数组通常用于存储一组指针,例如字符串数组。,其中每个元素都是指向字符的指针。我们可以使用循环访问每个元素,并打印出其值。在这个例子中,我们定义了一个指针数组。

qq_37934722的博客 305

C语言 数组指针详解

C语言 数组指针详解

cesheng3410的博客 1万+

C语言基础学习:变量、数组与指针精讲

在C语言中,变量是存储数据的基本单位。变量的声明(declaration)是对类型和名称的说明,但不分配内存空间;变量的定义(definition)则包括声明,并在内存中分配空间。声明和定义通常通过关键字intfloatchar等来完成,指定变量的数据类型。int a;// 声明一个整型变量aint b = 10;// 定义一个整型变量b,并初始化为10在C语言中,静态数组是在编译时分配内存的数组。它们的大小在声明时就已确定,并且在程序的生命周期内不会改变。

weixin_35750483的博客 933

【C语言】数组和指针

数组和指针,十分全面!!

Qiuhan_909的博客 1万+

掌握C语言指针:变量、数组与函数的深入理解

指针是一个变量,它的值是另一个变量的内存地址。通过指针,可以间接访问该内存地址存储的数据,同时指针也可用于动态内存分配。在内存中,每个变量都有一个确定的位置,指针正是用来定位这些位置的工具。

weixin_33582089的博客 1011

python毕设 基于Web的中药材信息查询系统程序+论文

***(程序+源码+数据库+调试部署+开发环境)论文文档1,文末可获取,系统界面在最后面。****

m0_74825541的博客 1257

C语言:指针、变量指针与指针变量、数组指针与指针数组

*概念:**数组指针是指向数组的指针(指针变量),本质上还是指针。指针变量指向数组元素和数组指针的区别?指针变量指向数组的元素;数组指针指向整个数组① 先有数组,再有指针② 它指向的是一个完整的数组。

2301_77829391的博客 1503

基于FPGA的NCO实现

NCO实现原理 数字振荡器 输出频率,相位可控的正弦波,精度高,稳定性高,替代VCO,用起来方便也易于操作。 实现方式: 直接调用fpga里面的ip核,以下是IP核的配置方法: 接下来选择输出为单路还是多路: 最后生成ip核时需要注意的事项: 生成时会需要漫长的等待,因此需要如下操作: 最后成功生成: 实现代码: input clk ; input rst_n ; output [13:0]fsin_i ; wire [13:.

m0_46644103的博客 4581

C语言:指针的变量运算及数组指针

从运算结果可以看出:pa、pb、pc 每次加 1,它们的地址分别增加 4、8、1,正好是 int、double、char 类型的长度;减 2 时,地址分别减少 8、16、2,正好是 int、double、char 类型长度的 2 倍。这很奇怪,指针变量加减运算的结果跟数据类型的长度有关,而不是简单地加 1 或减 1,这是为什么呢?

Dola的博客 1643

ADS1115 0-10V高精度ADC模块原理图设计,已量产

在水质监测、智能气象站、环境感知等领域,0-10V 电压输出的传感器占据了重要地位。这类传感器输出信号稳定、抗干扰能力强,但对数据采集模块的精度、线性度和易用性提出了严苛要求。本文将深度解析一款专为 0-10V 传感器设计的高精度 ADC 模块,从硬件架构、性能指标到工程化实践,全面呈现其设计思路与核心价值。

不脱发的程序猿 275

微信小程序 - 详细解决map地图上使用自定义图标图片或自定义样式进行markers标记点,手机真机运行时安卓系统、苹果ios系统会出现不显示标记点的问题(大概率安卓正常显示标记点,但苹果就加载失败)

微信小程序,map,地图组件,安卓android,苹果ios,真机调试,marker,标记点,在地图上标记,突然就不显示白屏了没动代码,自定义标记点icon,label动态数字,小程序地图markers标记点显示不出来,微信小程序map组件,地图加载后marker标记点ios设备不显示,android正常显示,添加多个标记点。安卓能正常显示标记点图标,IOS设备不显示标记点图标,map地图白屏不显示标记,图标真机调试不显示,自定义图标,报错,页面白屏,不报错也不显示,无法加载,图片展示不出来,iconPat

✅ 精选推荐文章 5956

C语言基础十一:指针变量与数组;数组指针及指针数组

我们之前所学的是指向数组元素的指针,本质上还是指针变量;现在我们学的是指向数组的指针,叫作数组指针。其中a是数组名,p是指向数组元素的指针变量,其初值:p=a;概念:指针数组是一个数组,数组中的每一个元素都是指针。概念:数组指针是指向数组的指针,本质上还是指针。需求:用指向元素的指针变量输出二维数组元素的值。//定义指针数组,指针数组用来存放指针的。2.实参用数组名,形参用指针变量。4.实参为指针变量,形参为数组名。1.形参和实参都是数组名。3.实参形参都用指针变量。通过指针引用多维数组。

m0_64837308的博客 1009

VMware Horizon 8 2111 部署系列(十一)准备RDS主机

RDS (Remote Desktop Service),即远程桌面服务。我们可以使用 Microsoft 远程桌面服务 (RDS) 提供 RDS 主机上的桌面会话并将应用程序传送给多个用户。

白昼的技术专栏 3469

C语言——指针数组、指向指针变量的指针变量:输入两个整数按顺序输出

内容在我的小破站里:https://www.liuzhi.org.cn/c%e8%af%ad%e8%a8%80/c%e8%af%ad%e8%a8%80-%e6%8c%87%e9%92%88%e6%95%b0%e7%bb%84%e3%80%81%e6%8c%87%e5%90%91%e6%8c%87%e9%92%88%e5%8f%98%e9%87%8f%e7%9a%84%e6%8c%87%e9%92%...

LIUZHIOJ的博客 1698

STM32 BOOTLOADER配置以及APP跳转实现(裸机)

Bootloader是硬件启动的引导程序,是运行操作系统的前提。在操作系统内核或用户应用程序运行之前运行的一段小代码。对硬件进行相应的初始化和设定,最终为操作系统准备好环境。APP就是我们的应用程序,经过硬件引导程序之后跳转到系统程序运行。

吻等离子的博客 3355

第1章:认识OpenClaw

OpenClaw是一个开源的 AI 智能体 Gateway 网关项目名称演变:OpenClaw 原名 Clawdbot,因 Anthropic 商标顾虑在 2026年1月27日更名为 Moltbot(过渡名),最终在1月30日确定为 OpenClaw。三个名字本质是同一个项目,功能完全一致。🏠在你的电脑上运行:完全本地部署,数据隐私有保障📁访问本地文件:可以搜索、读取、编辑你电脑上的文件🔌扩展能力:通过Skills(技能)系统无限扩展功能💬多平台使用。

Maynor的博客 2834

C语言:定义指向二维数组的指针变量

C语言:定义指向二维数组的指针变量标签: C语言 二维数组 指针 by 小威威1.引入我们知道,要在函数中处理数组,一般要给函数传递指针。那么,对于一维int数组a[10],我们可以定义一个int *类型的指针变量p指向该数组。为什么这样定义?(按照我下面的理解方式有利于理解二维数组指针的定义)首先我们可以把这个一维数组中的10个元素当作10个数组,每个数组都只有一个元素,即指针在每一次移动,

linwh8的博客 3万+

C语言设计模式全面解析:从理论到28个实战示例

本文系统介绍了23种经典设计模式在C语言中的实现方法。通过结构体、函数指针等技巧,C语言可以优雅地模拟面向对象特性,实现代码复用与解耦。文章分类详解了创建型、结构型、行为型三大类模式,并提供了28个完整代码示例,包括单例、策略、观察者等核心模式的精简实现。这些模式在嵌入式系统、操作系统内核等场景中广泛应用,如状态机、事件驱动等。学习C语言设计模式的关键在于理解模式意图,掌握函数指针和结构体组合等技巧,并在实际项目中灵活运用。本文为C语言开发者提供了全面的设计模式参考指南。

数字人生 363

C语言指针深入详解(四):指针变量、二维数组传参的本质、函数指针数组、转移表

前面几篇文章介绍了c语言的一些知识,包括循环、数组、函数、VS实用调试技巧、函数递归、操作符等,在这篇文章中,我将继续介绍指针的一些重要知识点!由于指针的内容较多,博主将会分为六篇博客介绍,这是第四篇啦!对指针感兴趣的友友们可以在评论区一起交流学习!

艾莉丝努力练剑的博客,感谢大家一直以来的对艾莉丝的支持和鼓励,uu们如果对C/C++方向感兴趣的话,可以通过艾莉丝主页的微信名片加艾莉丝的好友,和努力练剑的艾莉丝一起加油! 1630

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

嵌入式学习-C语言基础:指针、指针变量-变量指针、指针数组-数组指针-字符指针

元素的数据类型 (*变量名)[列数];

plmokn1314的博客 1361

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

浅谈C语言中的指针:指针变量大小、const修饰、指针加减、野指针、数组传参本质、函数指针、转移表(函数指针数组)

我们思考函数的形参是实参的临时拷贝,那么再函数内部进行变量交换时交换的时形参的数值,而实际参数依旧没变。为解引用操作符,将指针解开之后,编译器会按指针类型进行读取内存,例如整形指针解开之后编译器会按照指针所指向的位置往后读取4个字节,这样就可以像平常一样使用变量。,将各个函数的入口整合起来,这样可以少写很多if判断该用哪个函数,即创建一个数组,数组的类型是函数指针类型,数组的每一个元素都是一个函数的指针。那么在数组传参的时候,传递的是数组名,也就是说本质上数组传参传递的是数组⾸元素的地址。

暖焰核心的博客 643

【C语言】:详解函数指针变量,函数指针数组及转移表

什么是函数指针变量呢? 前面我们已经了解了整型指针与函数指针,通过类比我们可以知道:函数指针变量是用来存放函数的地址的,未来通过地址能够调用函数。那么函数是否有地址呢?并且通过类比数组,函数名与&函数名的值是否有区别呢? 我们来测试一下: 输出结果:我们发现两者的值是一模一样的。 我们知道数组名一般表示首元素地址,&数组名表示整个数组的地址,两者的值虽然一样,但是意义是完全不同的。 而函数名和&函数名表示的都是函数的地址,两者的意义完全相同,没有区别。如果我们要将函数的地址存放起来,就必须要创建函数指针变量

2301_77900444的博客 1263

C语言:指针2(指针变量指向数组)

引用一个数组元素,可以用:① 下标法:如 a[i] 形式。② 指针法:如 *(a+i) 或者 *(p+i)。其中a是数组名,p是指向数组元素的指针变量,其初值:p =a;案例需求:有一整型数组a,有10个元素。输出数组中的全部元素。分析:要输出各元素的值,有三种方法下标法;通过改变下标输出所有元素指针法(地址):通过数组名计算出数组元素的地址,找出数组元素值指针法(指针变量):用指针变量指向数组元素以上3种写法比较:第①种写法和第②种写法执行效率相同。

一起学习 1344

c语言指针变量访问数组元素,C语言:用指针访问数组元素:

任务代码:(如下)执行情况: 知识总结:知识点1:用指针访问数组元素:单独输出数组的名字就是相当于输出数组首元素的地址!= 数组的名字代表数组首元素的地址 int a[10]={1,2,3,,4,5,6,7,8,9,10};int *p;//先声明指针变量p=&a[0]//然后将指针赋予地址这种写法等同于:int a[10]={1,2,3,,4,5,6,7,8,9,10};int *p;/...

weixin_35411438的博客 1220

C语言 指针笔记:地址和指针、指针变量、char是整形的、 指针变量的基类型、指针运算、指针和数组、语法糖

指针也一样,定义了不赋初值,其保存的地址就会是随机地址,即指向内存中随机的数据,这很危险,说不定指向的是系统运行所必须的一个很重要的数据,如果通过指针修改指向的数据,可能系统就崩溃了(虽然并不会这样,系统的文件一般会有保护的,没那么容易修改),所以为了避免悲剧,指针必须赋初值。地址不能被保存到普通变量中,这时候就到指针变量出场了,指针变量这种变量是专门用来保存地址的,指针变量也可简称为指针。a、b 本身的值没变,变的只是指针 p、q 指向的数据,p 指针指向最大的数,q 指向最小的数。

undefinedUser_1的博客 2483

48 C 语言指针与函数核心详解:值传递、指针传递(变量地址、指针变量、数组名)、编程实战案例

本文详细解析了 C 语言中指针与函数的核心要点,涵盖值传递、指针传递概念及区别,强调 const 在指针传递中的作用。通过具体案例演示指针传递如何修改外部变量,并提供了多个编程练习,如交换数值、反转字符串、复制字符串、查找子串等,帮助读者深入理解并掌握指针与函数的使用技巧。

大模型全栈工程师 · Thanks_ks 2642
上一篇: C语言:指针基础知识
下一篇: C语言:字符数组和字符指针-、指针函数、 函数指针
三道渊
博客等级 码龄3年 118粉丝 39原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值