c 语言,指针,指针的指针
指针就是指向变量地址的东西。
比如:
- 定义了一个 int 变量
p
,值为 1 。 - 定义了 int 指针
pInt
指向了变量p
, 它的名字前面有个*
,此时pInt
就是 p 的地址,当前面加上*
就代表它指向的原变量p
,也就是说*pInt
的值就是p
的值。
同理,指向指针的指针就是多了一层,有两个**
,如下。
这里面 &
单目运算符就是取变量地址的,所以能看到下面的 int *pInt = &p
。
当指针前面加上对应它的 *
的时候就代指的原变量。
**pPint <=> *pInt <=> p
需要注意的是
指针的声明有两种方式,以下两种是一样的:
int a = 4;
int *p = &a
int* p = &a
一、普通用法
代码
#include "stdio.h"
int main(){
int p = 1;
int *pInt = &p;
int **pPInt = &pInt;
printf("number p is %d, pointer *pInt is %d, pointerPointer **pPInt is %d", p, *pInt,**pPInt);
}
结果
二、改变指针位置
可以通过对指针的加减来实现指针的前后移动,移动的量是当前类型的字节数。
代码:
#include "stdio.h"
int main(){
int array[10] = {1,2,3,4,5,6,7,8,9,0};
int* p = array;
*(p+8) = 3; // p 代表的是 [0] 位置的变量,+8 就是 [8] 位置的变量
for(int i=0;i<10;i++){
printf("%d, ", array[i]);
}
}
结果
三、结构体的传递
结构体作为函数的参数,如果直接传递结构体,那么在方法内对它的修改将只是在方法内,并没有改变原变量。
如下,定义了一个 User 的结构体,然后在方法中改变了 user
的 age
,但它并没有影响到外面的 user
.
#include "stdio.h"
typedef struct User {
char name[20];
int age;
} User;
void change_user_info(User user){
user.age = 35;
}
int main(){
User user = {"kyle", 32};
change_user_info(user);
printf("user info: {name: %s, age: %d}", user.name, user.age);
return(0);
}
运行结果:
但如果我们将方法的参数改成指针,就可以从方法内修改外面的 user
变量了。也就是说在方法内的修改是直接改变了程序中 user
内存的内容。
#include "stdio.h"
typedef struct User {
char name[20];
int age;
} User;
void change_user_info(User* user){
user->age = 35;
}
int main(){
User user = {"kyle", 32};
change_user_info(&user);
printf("user info: {name: %s, age: %d}", user.name, user.age);
return(0);
}
结果: