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;
}