死磕C语言指针

本文详细介绍了C语言的指针概念,包括指针的声明、运算符、简单示例、指针与数组、指针数组、多级指针、字符指针与字符串、指针型函数、函数指针以及结构体指针的用法,提供了多个实例帮助理解。
摘要由CSDN通过智能技术生成

免费版:死磕 C 语言指针

兜兜转转还是逃不过 C 语言,这该死的缘分。先看一眼我的西野七濑

学习自:该内容暂无法显示 - 知乎

目录

1 指针

1.1 指针是乜嘢

1.2 指针的声明

1.3 运算符

1.4 简单的小例子们:

例子1 

例子2:指针在函数间通信

1.5 指针的运算

1.5.1 指针加减运算

1.5.2 间址运算

1.5.3 指针的相减 = 两个地址之间的偏移量

2 指针与数组

2.1 指针和一维数组

2.1.1 定义数组及指针变量

2.1.2 能动手就不要瞎扯

2.2 指针和二维数组

2.2.1 定义

2.2.2 能动手就不要瞎扯

3 指针数组

3.1 定义

3.2 灵活的双手动起来

4 多级指针

5 字符指针与字符串

5.1 定义

5.2 打代码

6 指针型函数

6.1 定义

6.2 敲代码

7 指向函数的指针

7.1 定义

7.2 码代码

8 结构体指针

8.1 结构体变量指针

8.1.1 定义

8.1.2 干活

8.2 结构体数组指针

8.2.1 定义

8.2.2 搬砖


1 指针

1.1 指针是乜嘢

指针(pointer):一个值为内存地址的变量。

char 类型变量的值是字符,int 类型变量的值是整数,指针变量的值是地址。

1.2 指针的声明

数据类型 *指针名,这里的 * 表明声明的变量是一个指针,没有访问指针目标的含义。

int * pi; // pi是指向int类型变量的指针
char * pc; // pc是指向char类型变量的指针
float * pf; // pf是指向float类型变量的指针

指针存放的值是一个地址,在大部分系统内部,该地址由一个无符号整数表示,但不能把指针认为是整数类型。

  • 指针变量不能赋予常量值
  • 不能接受键盘输入的数据

1.3 运算符

间接运算符 *:访问地址的目标

val = *ptr; // 找出ptr指向的值

地址 & 运算符:取变量的存储地址

&num 表示变量 num 的地址。

1.4 简单的小例子们:

例子1 

#include <stdio.h>
 
int main ()
{
   int  num = 97;   
   int  *p;        // 指针变量的声明 
   p = &num;       //在指针变量中存储 num 的地址 

   printf("Address of var variable: %p\n", &num );
   // 指针变量中存储的地址 
   printf("Address stored in ip variable: %p\n", p );
   // 使用指针访问值 
   printf("Value of *ip variable: %d\n", *p );
   return 0;
}

结果:

图解

例子2:指针在函数间通信

#include<stdio.h>

void interchange(int *u, int *v);

int main(){
	int x = 5, y = 10;
	printf("Originally x = %d and y = %d.\n", x,y);
	
	interchange(&x, &y);
	printf("Now x = %d and y = %d.\n", x,y);
	
	return 0;
}

void interchange(int *u, int *v){// 参数为指针,函数传递的是地址 ,u与v存的是地址 
	int temp;
	temp = *u; // 直接改变对应地址存放的值 
	*u= *v;
	*v= temp; 
}

结果:

1.5 指针的运算

知识点:

  • 三个操作符的优先级:() > [] > *,没错 * 是最卑微的
  • *p++ 里,* 号和 ++ 属于同一优先级,且方向都是从右向左的,*p++ 和 *(p++) 作用相同

1.5.1 指针加减运算

#include<stdio.h>

void main(){
	int a=10,b=20,c=30;
	int *p=&b;
	printf("%p\n",&a);
	printf("%p\n",&b);
	printf("%p\n",&c);
	p=p+1;
	printf("%p\n",p);
	p=p-2;
	printf("%p\n",p);	
} 

结果:

1.5.2 间址运算

*p++:* 与 ++ 同优先级,结合方向为自右向左,p++,先赋值再自加,因此结果等价于 *p 返回其值,p++

*++p:++p,先自加后赋值,等价于 p++, *p 返回其值

(*p)++:括号优先,等价于 *p 返回其值,然后将 *p 的结果 + 1

例:

#include<stdio.h>

int main(){
	int a[] = {10,20,30}, *p=a; 
	printf("*p++ is %d\n", *p++);   
	p=a; 
	printf("*++p is %d\n", *++p); 
	p=a; 
	printf("++(*p) is %d\n", ++(*p)); 
	p=a;
	printf("a[0] is %d\n",a[0]);
	printf("(*p)++ is %d\n", (*p)++); 
	return 0;
}

评论 24
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值