1,指针的理解
指针,也是一个变量的数据类型,它的值是另外一个变量的地址。也就是说指针是存放内存地址变量的一种特殊数据类型。
1.1 声明一个指针变量:char *p = &achar;
* p:指针变量本身的名字;
* “*”:表示p是一个指针变量;
* &:取地址运算符,返回变量地址;
* &achar:代表变量achar的地址编号;
* =:把变量achar的地址编号,赋值给指针变量p。
此时,指针p里存储的,是字符变量achar的地址编号,即指针p指向achar。
1.2 指针运算符:
* &取地址运算符;
* 使用%p打印一个地址编号,打印指针变量的值;
* 指针变量所占的内存大小为4个字节(64位下为8个字节)的整数。
列如:
#include <stdio.h>
int main()
{
char a;
char b;
printf("%p,%p\n",&a,&b);
}
2, 指针变量
* 他的值就是个地址编号;
* 指针变量的值可以改变,存储一个新的地址,即指向另外变量。
* 他是有类型的
* 多个指针可以指向同一个变量。
3, 通过指针访问指针指向的变量
*解引用运算符,即间接引用运算符
*解引用运算符的作用
如例:
#include <stdio.h>
int main()
{
int x;
int *p,*q;
p = &x;
q = &x;
x = 4;
printf("x = %d\n",*p);
printf("x = %d\n",*q);
printf("x = %d\n",x);
return 0;
}
/*
x = x + 3;//x=7;
int y = x;//y=7;
int z = *p;//int z = x = 7;
*p = 8;//x = 8;
*q + *p//x + x;
*&x:从右往左看,&x是x的地址,即指向x的指针,*&x等价于x。
*&x = *q + *p等价于x=x+x;
*/
4,声明一个指针变量;列如:
char *p; int * q; float * r; long double *s; long int *t;
5, 未初始化的指针称作悬浮指针。
6,初始化指针
* 空指针:当定义一个指针,你还不确定要指向哪个变量时,就把他初始化量为空。
int *p;
p = NULL;或 p = 0;//c语言中,空指针的值可以用 NULL 和 0 来表示;
* 在用到的地方对空指针进行初始化:int a = 8;int *p = &a;
7, 用指针做函数参数
7.1 传指针:
#include <stdio.h>
void exchange(int *a,int *b);
int main()
{
int a,b;
scanf("%d,%d",&a,&b),
exchange(&a,&b);//把变量a和变量b的地址,传递给exchange函数中的形参指数变量。
printf("%d,%d",a,b);
return 0;
}
{void exchange(int *a,int *b)
int temp = 0;
temp=*a;//等价于temp=a;temp存储原来的a的值
*a=*b;//等价于a = b;
*b=temp;//b等于原来的a;
8, 函数返回一个指针变量}
列如:输出两个数中最大值
#include <stdio.h> int* smaller(int *a,int *b) { return *a>*b?a:b;//等价于return(a<b?&a:&b); } int main() { int a,b,*p; scanf("%d,%d",&a,&b); p=smaller(&a,&b); printf("%d\n",*p); }
9, 内存分配
9.1 内存分配类型:
在C,C++中内存分为5个区,分别为栈区,堆区,全局|静态存储区,常量存储区,代码区。
静态内存分配:编译时分配。包括:全局,静态全局,静态局部三种变量。
动态内存分配:运行时分配。 包括:
* 栈 :局部变量。push ,入栈;Pop,出栈。
float* func(int n) / /形参n被分配在栈上
{
float array[n];
return array;/*severe mistake*/
}
* 堆:C语言中用到的变量被动态的分配在内存中。(malloc或calloc,realloc,free函数)