C语言—指针、数组指针与指针数组、数组和指针、结构体指针

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


}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值