指针
代码
#include <stdio.h>
int main(){
int a = 10;
//指针类型需要与变量的类型相同,且后面需要添加一个*符号(注意这里不是乘法运算)表示是对于类型的指针
int * p = &a; //这里的&并不是进行按位与运算,而是取地址操作,也就是拿到变量a的地址
printf("a在内存中的地址为:%p\n", p); //地址使用%p表示
printf("a的值为:%d\n",*p); //*是指将p地址的值取出来
// 通过指针修改值
*p = 777;
printf("*p修改后的值为:%d\n", *p);
printf("a的值为:%d\n", a); //a的值也被修改为777,以为是同一个地址
//数组指针
char str[] = "Hello World!";
printf("数组表示法:%c\n", str[1]); //数组表示法,输出数组第二个字符
char * pp = str;
printf("第一个元素值为:%c,第二个元素值为:%c", *pp, *(pp+1)); //指针表示法,通过指针也可以表示对应位置上的值
}
运行效果
结构体
代码
#include <stdio.h>
//定义结构体
struct Student { //使用 (struct关键字 + 结构体类型名称) 来声明结构体类型,这种类型是我们自己创建的(同样也可以作为函数的参数、返回值之类的)
int id; //结构体中可以包含多个不同类型的数据,这些数据共同组成了整个结构体类型(当然结构体内部也能包含结构体类型的变量)
int age;
char *name; //用户名可以用指针指向一个字符串,也可以用char数组来存,如果是指针的话,那么数据不会存在结构体中,只会存放字符串的地址,但是如果是数组的话,数据会存放在结构体中
};
//函数
void test(struct Student * student){ //这里使用指针,那么现在就可以指向外部的结构体了
student->age = 19; //别忘了指针怎么访问结构体内部数据的
}
int main() {
//定义结构体,stu是结构体变量
struct Student stu = {.id=1,.age=18,.name="小明"};
printf("%d,%d,%s\n", stu.id,stu.age,stu.name);
//结构体指针,赋值传递
struct Student student = {1, 20, "小红"};
struct Student * p = &student; //同样的,类型后面加上*就是一个结构体类型的指针了
printf("%d\n",(*p).age);
//输出方式,两者是一样的
printf("%s\n", (*p).name); //由于.运算符优先级更高,所以需要先使用*p得到地址上的值,然后再去访问对应数据
printf("%s\n", p->name); //使用 -> 运算符来快速将指针所指结构体的对应数据取出
//结构体函数
struct Student s = {1, 77, "小新"};
test(&s); //传递结构体的地址过去
printf("%d\n", s.age);
}