1 指针的定义
指针是一个数据类型,用来表示地址。跟int一样,int用来表示整型。 指针类型的变量是一个普通的变量,也就是指针变量,既然是变量就会有自己的类型,也会有自己的值。只不过指针变量的值跟一般变量不太一样,指针变量的值是一个地址。
指针变量
类型* 变量名 = &a;如下:
int a=3,b=7;
int* pa = &a; //定义指针变量pa,pa指向a的地址
int* pb = &b;
printf("%p\n",pa);//打印地址编号。%p 十六进制格式
printf("%p\n",pb);
指针的使用
*变量名 = 基类型的值
int a=3,b=7;
int* pa = &a;
int* pb = &b;
//星号*也称为解引用运算符,在指针变量前面加个*,就可以表示这个指针所指向的地址的值了
*pa = 8;//将8赋值给a。
pb = &a;//令指针变量pa指向a的地址
printf("%d %d\n", *pa, *pb);
2 数组指针与指针数组
什么是数组指针、指针数组?
数组指针:即数组的指针,落脚点在指针,指向数组的指针。
指针数组:即指针的数组,落脚点在数组,装着指针的数组。
注意优先级顺序:[ ] > *
//指针数组
const char* arr[5] = { "h","e","l","l","0"};//当为常量指针时,不可以通过修改所指向的变量的值,但是指针可以指向别的变量。
int brr[] = { 1,2,3,4 };
int* p = brr;
//数组的名字就是数组的首地址,即第0个元素brr[0]的地址,是个常量。
//数组指针
int(*q) [4] = &brr;
注意:下面是错误的:等号两边的数据类型不一致。左边的类型是指向整个数组的指针,而右边的数据类型brr是指向单个字符的指针
int (*q) [4] = brr;
- brr、&brr[0]、&brr是地址值相同的三个值。
- 对于前两个值,指针变量+1,表示+4字节
- 对于&brr,指针变量指向整个数组,指针变量+1,表示+整个数组的大小,也就是4*4=16个字节
3 数组和指针的关系
3-1 一维数组
int brr[] = {1,2,3};
int *p = brr;//int* p = &brr[0];
p+1 —> +1*sizeof(int) —> 4字节
brr[2] —> *(brr+2)
3-2 二维数组
int arr[2][3] = { 1,2,3,4,5,6 };
int(*p)[3] = &arr[0];
p+0 —>&arr[0]
*(p+0) —>arr[0]
※(※(p+0)+0) —>arr[0][0]
p+1 —>&arr[1]
p+1 —>+3*sizeof(int)
arr[1] —>*(arr+1) ; arr+1:第二行整体元素的首地址
arr[1][2] —>※(※(arr+1)+2); *(arr+1)+2:第二行第三列元素的地址
4 结构体指针
4-1 结构体
#include<stdio.h>
typedef struct Student {
int id;
const char* name; //节省内存
char sex[4];
int age;
}stu;
int main() {
stu st1 = { 10010,"张三","男",19 };
printf("%s\n", st1.name); //张三
}
4-2 结构体指针
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
typedef struct Student {
int id;
char name[10]; //节省内存
char sex[4];
int age;
}stu;
int main() {
stu st1 = { 10010,"张三","男",19 };
stu* st2 = &st1; //定义一个结构体指针变量st2.进行成员访问:->指向符
//strcpy((*st2).name, "lisi");//方式1
strcpy(st2->name, "lisi");//方式2
//printf("%s\n", st1.name); //方式1 lisi
//printf("%s\n", (*st2).name);//方式2 lisi
printf("%s\n", st2->name);//方式3 lisi
}