新年快乐~这份超详细的指针详解请收下(不信还有更详细的了捏)
一定要认真看捏~这篇文章已经写了好久啦 现在凌晨三点终于完工了 下面是我对指针的一些理解 希望对你有帮助 临近期末 一起加油哦
目录
指针总结
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; /* 一个字符型的指针 */
所有实际数据类型,不管是整型、浮点型、字符型,还是其他的数据类型,对应指针的值的类型都是一样的,都是一个代表内存地址的长的十六进制数。
不同数据类型的指针之间唯一的不同是,指针所指向的变量或常量的数据类型不同。
说到这里 就一起看看指针的类型和指针所指向的类型吧(关于指针你必须知道的...)