用一局王者的时间 彻底拿下c语言指针(覆盖c语言各个部分 考试周限定超详细版)

新年快乐~这份超详细的指针详解请收下(不信还有更详细的了捏)

 

 一定要认真看捏~这篇文章已经写了好久啦 现在凌晨三点终于完工了 下面是我对指针的一些理解 希望对你有帮助 临近期末 一起加油哦

目录

1.什么时候用指针?

2.内存地址与指针

1.地址与取地址运算

2.地址与字节的关系

2.什么是指针?

1.指针的类型

2.指针所指向的类型

3.指针的值(指针所指向的内存区或地址)

4.指针的算术运算

3.指针的定义与使用

1.变量的访问形式

2.指针与指针变量

指针变量的定义

指针变量的引用

& 与* p = &a ;

4.指针与函数

1.传递指针给函数

 2.函数返回指针

3.指向函数的指针

5.指针与数组

一维数组与指针  

二维数组与指针

指针和数组的区别

6.指针与结构类型

7.指针与字符串

定义指向字符串的指针变量    

输出字符串

字符数组与字符指针变量的区别  

字符串指针作函数参数

8.指针的类型转换



指针总结

1.什么时候用指针?

1. 需要改变实参的时候, 只能用指针。
2. 传递大型结构并且"只读"其元素的时候。因为大型结构通过值传递, 需要拷贝其每个元素, 这样效率太低
3. 需要遍历数组或频繁引用其元素时,这样效率比使用下标高。
4. 动态分配空间时, 必须使用指针。
5. 传递数组时, 必须使用指针。
6. 函数返回多个值,某些值就必须通过指针带回。
7.函数返回运算的状态,结果通过指针返回。

例如如下代码 要返回两个值(即最大值和最小值),而return只能返回一个,就要用指针方法了。

#include<stdio.h>
void compare(int a[],int len,int *min,int *max){
	*min=*max=a[0];
	for(int i=0;i<len;i++){
		if(a[i]<*min){
			*min=a[i];
		}
		if(a[i]>*max){
			*max=a[i];
		}
	}
}



int main(){
	int a[]={0,1,2,3,4,5,6,7,8,9};
	int min,max;
	compare(a,sizeof(a)/sizeof(a[0]),&min,&max);
	printf("min=%d,max=%d",min,max);
	return 0;
}

2.内存地址与指针

运行程序时程序、数据都存在内部存储器。 内部存储器由很多存储单元组成。 每个存储单元有自己独有的地址,称为内存地址。

每一个变量都有一个内存位置,每一个内存位置都定义了可使用 & 运算符访问的地址,它表示了在内存中的一个地址。

打个比方,计算机的内存可以看成一排排房屋,每个房屋都要有门牌号,这些门牌号就相当于计算机的内存地址,而房屋里面的东西就相当于需要存放的各种各样的数据,所以要想访问这些数据,就得知道它的内存地址。

先来认识一下地址吧。

1.地址与取地址运算

C程序中的变量在内存中占有一个可标识的存储区, 每一个存储区是由若干个字节组成, 每一个字节都有自己的地址, 在程序中所定义的变量,编译系统会根据变量的类型,分配不同长度的内存。 当变量只占用一个字节,该字节的地址就是变量的地址。 当变量占用连续若干字节,第一个字节的地址就是变量的地址。

C语言允许在程序中使用变量的地址 ( 通过地址运算符&可得到)  

如:  float   x ;         变量 x 的地址 ---- &x          

       int    a[10] ;    数组变量 a 的地址 ---- 数组名 a

实例如下,它将输出定义的变量地址:

#include <stdio.h>
 
int main ()
{
    int a = 10;
    int *p;              // 定义指针变量
    p = &a;
 
   printf("a变量的地址: %p\n", p);//取地址用%p
   return 0;
}

当以上代码被执行时,产生的结果是:

说明:(1)p是一个指针,存储着变量a的地址。

(2)指针p的类型必须与变量a的类型保持一致,因为整型指针只能存储整型变量的指针地址。

2.地址与字节的关系

地址就是以字节做单位的。指针类型占4个字节。

具体某种数据类型所占的字节数是编译器根据操作系统的位数决定的,这时就可以用sizeof对其进行测定。

用sizeof操作一下叭~

#include<stdio.h>
int main(){
	int ip;
	float fp;
	double dp;
	char chp;
	//sizeof操作符用于计算变量的字节大小
	printf("Size of int:%ld bytes\n",sizeof(ip));
	printf("Size of float:%ld bytes\n",sizeof(fp));
	printf("Size of double:%ld bytes\n",sizeof(dp));
	printf("Size of char:%ld bytes\n",sizeof(chp));
	return 0; 
}

运行结果如下:

附上一张c类型所占字节数的表格

c类型 32位平台(所占字节数) 64位平台(所占字节数)
int 4 4
float 4

4

short int 2 2
char 1 1
double 8 8
int * 4 4

2.什么是指针?

通常程序猿口中的指针指的就是内存的地址。

指针变量是用来存放内存地址的变量。就像其他变量或常量一样,在使用指针存储其他变量地址之前,对其进行声明。指针变量声明的一般形式为:

type *var-name;

在这里,type 是指针的基类型,它必须是一个有效的 C 数据类型,var-name 是指针变量的名称。用来声明指针的星号 * 与乘法中使用的星号是相同的。但是,在这个语句中,星号是用来指定一个变量是指针。下面是指针的正确声明样例:

int    *ip;    /* 一个整型的指针 */
double *dp;    /* 一个 double 型的指针 */
float  *fp;    /* 一个浮点型的指针 */
char   *chp;    /* 一个字符型的指针 */

所有实际数据类型,不管是整型、浮点型、字符型,还是其他的数据类型,对应指针的值的类型都是一样的,都是一个代表内存地址的长的十六进制数。

不同数据类型的指针之间唯一的不同是,指针所指向的变量或常量的数据类型不同

说到这里 就一起看看指针的类型和指针所指向的类型吧(关于指针你必须知道的...)

1.指针的类型

从语法的角度看,只要 把指针声明语句里的指针名字去掉,剩下的部分就是这个指针的类型 。这是指针本身所具有的类型。比如说:
(1)int*ptr;
//指针的类型是 int*
(2)char*ptr;
//指针的类型是 char*
(3)int**ptr;
//指针的类型是 int**
(4)int(*ptr)[3];
//指针的类型是 int(*)[3]
(5)int*(*ptr)[4];
//指针的类型是 int*(*)[4]

2.指针所指向的类型

当通过指针来访问指针所指向的内存区时,指针所指向的类型决定了 编译器将把那片内存区里的内容当做什么来看待。
从语法上看,你只须 把指针声明语句中的指针名字和名字左边的指针声 明符*去掉,剩下的就是指针所指向的类型。 例如:
(1)int*ptr;
//指针所指向的类型是 int
(2)char*ptr;
//指针所指向的的类型是 char
(3)int**ptr;
//指针所指向的的类型是 int*
(4)int(*ptr)[3];
//指针所指向的的类型是 int()[3]
(5)int*(*ptr)[4];
//指针所指向的的类型是 int*()[4]
在指针的算术运算中,指针所指向的类型有很大的作用。
指针的类型(即指针本身的类型)和指针所指向的类型是两个概念,要注意区分。

3.指针的值(指针所指向的内存区或地址)

指针的值是指针本身存储的数值,这个值将被编译器当作一个地址,而 不是一个一般的数值。 在 32 位程序里,所有类型的指针的值都是一个 32 位整数,因为 32 位程序里内存地址全都是 32 位长。 指针所指向的内存区就是从指针的值所代表的那个内存地址开始,长度为 sizeof(指针所指向的类型)的一片内存区。以后,我们说一个指针的值是xxxx,就相当于说该指针指 向了以 xxxx为首地址的一片内存区域;我们说一个指针指向了某块内存区域,就相当于说该指针的值是这块内存区域的首地址。
吾日三省吾身。以后,每遇到一个指针,
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值