指针在C语言中是比较重要的,个人认为,C语言中最重要的是内存,如何操作内存是至关重要的,指针是C语言的精华,学好了指针才可以说C语言入了门。接下来认真总结一下C语言中指针的用法。
指针基础
1、指针是一种数据类型
数据类型的本质是固定大小内存块的别名,指针毫无例外,指针也是占有内存空间的,在32位机器中,指针是占4个字节的,指针存储的是一个地址,通过这个地址可以访问到一段内存空间。
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main(void)
{
int *p = NULL;
char *s = NULL;
printf("%d %d", sizeof(p), sizeof(s));
system("pause");
return 0;
}
2、指针变量
指针也是一种变量,它的值为另一个变量的地址。
int *ip; /* 一个整型的指针 */
double *dp; /* 一个 double 型的指针 */
float *fp; /* 一个浮点型的指针 */
char *ch; /* 一个字符型的指针 */
不同类型的指针之间唯一的不同是,指针所指向的变量或常量的数据类型不同。
*号
在指针声明时,*号表示所声明的变量为指针;、
在指针使用时,*号表示操作指针所指向内存空间中的值。
*p相当于通过地址(p变量的值)找到一块内存;然后操作内存
*p放在等号的左边赋值(给内存赋值)
*p放在等号的右边取值(从内存获取值)
3、指针变量和它所指向的内存块是两种不同的概念
指针变量存储的是4个字节大小的内存地址,指针所指向的内存块里存储着另一个变量的值。
4、指针的步长,根据所指向的内存空间的类型来决定。
int main(void)
{
int *p1 = NULL;
//int *p2 = NULL;
char *p3 = NULL;
float *p4 = NULL;
int a;
int b[10];
char c;
float d;
p1 = &a;
//p2 = &b;
p3 = &c;
p4 = &d;
printf("%d %d\n", p1, p1 + 1);
printf("%d %d\n", &b, &b + 1);
printf("%d %d\n", p3, p3 + 1);
printf("%d %d\n", p4, p4 + 1);
system("pause");
return 0;
}
注意
- 指针指向谁,就把谁的地址赋给指针
- 不断的给指针变量赋值,就是不断的改变指针变量,就是不断的修改指针的指向(和所指向的内存空间里的值无关)
间接赋值
void f(int *p)
{
*p = 30;
}
int main(void)
{
int a = 10;
int *p = NULL;
p = &a;
*p = 20;//p的值是a的地址,通过这个地址找到一段内存空间,间接的修改了a的值;
printf("a = %d\n", a);
f(p);
printf("a = %d\n", a);
system("pause");
return 0;
}
我们可以通过被调用函数间接的修改某一变量的值,也就是说,我们可以通过一个函数将运算的结果传出来,或许我们可以给函数加上返回值,但是函数返回值只能把一个运算结果返回,如果我们要修改两个或两个以上的变量的值呢,这样的方法显然就不适用了,这就是指针作为函数参数间接修改变量的值的精华之处。
指针、函数与内存四区
-
主调函数与被调函数:
a) 主调函数可把堆区、栈区、全局数据内存地址传给被调用函数
b) 被调用函数只能返回堆区、全局数据
-
内存分配方式
a) 指针做函数参数,是有输入和输出特性的。
输入:指针所指向的内存空间是在主调用函数中分配好的
输出:指针所指向的内存空间是在被调用函数中分配好的