C语言学习07:指针

张建 lol

定义指针变量

类型名 * 指针变量名

星号 是用来指定一个 变量是指针

什么是指针?

指针 就是 内存地址指针变量 是用来 存放内存地址的变量

指针的声明:

1
2
int  *ip;    // 一个整型的指针
char *cp; // 一个字符型的指针

如何使用指针

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
int main(int argc, const char * argv[]) {

int var=20; // 实际变量的声明
int *ip; // 指针变量的声明

ip = &var; // 在 指针变量中存储 var 的地址

printf("var 变量的地址:%p\n",&var);

/* 在指针变量中存储的地址 */
printf("ip 变量存储的地址: %p\n",ip);
/* 使用指针访问值 */
printf("*ip 变量的值: %d\n",*ip);

return 0;
}

当上面的代码被 编译和运行 时,产生的结果

1
2
3
4
var 变量的地址:0x7ff7bfeff45c
ip 变量存储的地址: 0x7ff7bfeff45c
*ip 变量的值: 20
Program ended with exit code: 0

注:&取地址运算符。&a是变量a的地址。

指针数组

指向整数类型的指针数组

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
// 常量
const int MAX = 3;

int main(int argc, const char * argv[]) {
// 数组
int var[] = {10,100,200};
int i,*ptr[MAX];
for (i=0; i<MAX; i++) {
// 赋值为整数的地址
ptr[i] = &var[i];
}
for (i=0; i<MAX; i++) {
printf("value of var[%d]=%d\n",i,*ptr[i]);
}

return 0;
}

当上面的代码被 编译和运行 时,结果

1
2
3
4
value of var[0]=10
value of var[1]=100
value of var[2]=200
Program ended with exit code: 0

指向指针的指针

指向指针的指针是一个 指针链,第一个指针指向第二个指针的 地址,第二个指针指向 实际值的位置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
int main(int argc, const char * argv[]) {
int v;
int *p1;
int **p2;

v=100;

// 获取v的地址
p1=&v;

// 获取p1的地址
p2=&p1;

// 打印值
printf("var=%d\n",v);
printf("p1=%p\n",p1);
printf("*p1=%d\n",*p1);
printf("p2=%p\n",p2);
printf("**p1=%d\n",**p2);

return 0;
}

当上面的代码被 编译和运行 时,结果:

1
2
3
4
5
6
var=100
p1=0x7ff7bfeff3bc
*p1=100
p2=0x7ff7bfeff3b0
**p1=100
Program ended with exit code: 0

传递指针给函数

C 语言允许传递 指针给 函数,只需要简单的声明函数参数为指针即可

示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#include <stdio.h>

int main(int argc, const char * argv[]) {
// 函数的声明
void exchange(int *a,int *b,int *c);
int a,b,c;
printf("请输入 a b c:");
scanf("%d,%d,%d",&a,&b,&c);
exchange(&a, &b, &c);
printf("order:%d,%d,%d\n",a,b,c);

return 0;
}
void exchange(int *a,int *b,int *c){
// 函数的声明
void swap(int *x,int *y);
// 交换
if (*a > *b) swap(a, b);
if (*a > *c) swap(a, c);
if (*b > *c) swap(b, c);
}
void swap(int *x,int *y){
int temp;
temp = *x;
*x = *y;
*y = temp;
}

从函数中返回指针

必须 声明一个返回指针的函数,C 语言不支持调用函数时,返回局部变量的地址,除非定义局部变量的 static 变量

实例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27

#include <stdio.h>
#include <stdlib.h>

#define MAX 5;

// 函数定义
int * getRandom(void){
static int r[10];
for (int i=0; i<MAX; i++) {
r[i]=rand();
printf("%d\n",r[i]);
}
return r;
}

int main(int argc, const char * argv[]) {

int *p;
p=getRandom();
for (int i=0; i<MAX; i++) {
printf("*(p+[%d]):%d\n",i,*(p+i));
}

return 0;
}

当上面的代码 编译和运行 时,产生的结果

1
2
3
4
5
6
7
8
9
10
11
16807
282475249
1622650073
984943658
1144108930
*(p+[0]):16807
*(p+[1]):282475249
*(p+[2]):1622650073
*(p+[3]):984943658
*(p+[4]):1144108930
Program ended with exit code: 0
  • Post title:C语言学习07:指针
  • Post author:张建
  • Create time:2023-02-13 20:37:03
  • Post link:https://redefine.ohevan.com/2023/02/13/C学习/C语言学习07:指针/
  • Copyright Notice:All articles in this blog are licensed under BY-NC-SA unless stating additionally.