C语言指针之指针的指针,指针与函数

本文详细介绍了C语言中的指针概念,包括多级间接寻址、指针作为函数参数的传递,以及从函数返回指针的重要性。通过实例演示了如何使用指针操作变量和数组,以及静态变量和外部变量的区别。
摘要由CSDN通过智能技术生成

4、指向指针的指针

**p是多级间接寻址,或者说指针链。通常一个指针包含一个变量的地址,当定义指针的指针时,指针1包含变量的地址,指针2包含指针1的地址;

定义形式为int **p;

例:

#include <stdio.h>
int main() 
{
    int var = 1;
    int *ptr1;    //定义指针变量
    int **ptr2;   //定义指针的指针

    ptr1 = &var;  //将变量的存储地址给ptr1
    ptr2 = &ptr1; //将ptr1的存储地址给ptr2

    printf("var = %d\n", var);      //打印变量var
    printf("ptr1 = %p\n", ptr1);    //打印var的存储地址
    printf("*ptr1 = %d\n", *ptr1);  //打印指针*ptr指向的对象,即var
    printf("ptr2 = %p\n", ptr2);    //打印ptr1的存储地址
    printf("*ptr2 = %p\n", *ptr2);
    printf("**ptr2 = %d\n", **ptr2); //打印指针的指针ptr2指向的对象,即var
    return 0;
}

5、传递指针给函数

函数的参数可以是指针,将指针传递给函数。

定义指针时可用 int* p 代替 int *p 来避免歧义。但要注意 int *a, b, c最好不要写成int* a, b, c;

例:

#include <stdio.h>
#include <time.h>
void getSeconds(unsigned long* par); //定义函数,参数为指针(地址)

int main ()
{
    unsigned long sec;
    getSeconds(&sec);  // 调用函数,参数&sec为变量sec的地址
    printf("Number of seconds: %ld\n", sec);
    return 0;
}

void getSeconds(unsigned long* par)
{
    *par = time(NULL);  //将数据传递给指针par指向的变量
}

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

数组名本身就是一个指针,指向数组的第一个元素。

例:

#include <stdio.h>

void print_array(int *arr, int size); // 函数声明

int main() 
{
    int arr[] = {1, 2, 3, 4, 5};
    int size = sizeof(arr) / sizeof(arr[0]);
    print_array(arr, size);  //数组名本身是一个指针,指向数组第一个元素
    return 0;
}

void print_array(int *arr, int size) // 使用指针作为函数参数
{
    printf("数组内容:\n");
    for (int i = 0; i < size; i++) 
    {
        printf("%d ", arr[i]);
    }
    printf("\n");
}

如不使用指针,上述程序可改写为:

#include <stdio.h>
void print_array(int arr[], int size);

int main() 
{
    int arr[] = {1, 2, 3, 4, 5};
    int size = sizeof(arr) / sizeof(arr[0]);
    print_array(arr, size);

    return 0;
}

void print_array(int arr[], int size) 
{
    printf("数组内容:\n");
    for (int i = 0; i < size; i++) 
    {
        printf("%d ", arr[i]);
    }
    printf("\n");
}

5、从函数返回指针

static int a;

static关键字用于声明静态变量,可以在多个函数中共享,不需要为每个函数创建一个新变量;且在局部修改时只会改变局部的值,不影响其他部分的使用。

extern int b;

extern声明外部变量,可以再程序的其他文件中使用extern声明的变量。

注:C 语言不支持在调用函数时返回局部变量的地址,除非定义局部变量为 static 变量。

例:(生成 10 个随机数,并使用表示指针的数组名(即第一个数组元素的地址)来返回它们)

#include <stdio.h>
#include <time.h>
#include <stdlib.h> 
 
int * getRandom( )
{
   static int  r[10];
   int i;
 
   srand((unsigned)time(NULL));  //设置随机种子
   for ( i = 0; i < 10; ++i)
   {
      r[i] = rand();          //生成10个随机数
      printf("%d\n", r[i] );
   }
   return r;
}
 
int main ()
{
   int *p; 
   int i;
   p = getRandom();
   for ( i = 0; i < 10; i++ )
   {
       printf("*(p + [%d]) : %d\n", i, *(p + i) );
   }
   return 0;
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值