------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------
1.指针的概念
在计算机中,一个字节占8位,每个字节都有一个编号,就是地址。当程序中定义了一个变量,编译时系统就会给这个变量分配内存单元。
scanf(“%d”,&a);像
像这种按变量取地址访问的方式叫做“直接访问方式”。
在C语言中,还有一种间接访问的方式,就是变量的地址存储在另一个变量里。
2.指针的定义以及应用
指针是一种特殊的变量,它存放的是另一个变量的地址。换句话说,一个变量的地址就是该变量的“指针”。
如果有一个变量专门用来存放另一变量的地址(即指针),则它称为“指针变量”。
指针可以理解为就是地址,而存放地址的变量就是指针变量。
定义指针变量的一般形式为
类型 *指针变量名;
int *p 就是一个指向整型变量的指针变量;还可以取地址直接給指针赋值。
int *p = &a;
指针变量前的*号表示这个变量是一个指针变量,而变量的名是p;
在定义一个指针变量的时候必须指定变量的基本类型。
int a ;
float *p = &a //这是一种错误的方式,因为只有整型变量才可以赋值给整型的指针变量
需要注意的是,指针变量只能存放地址。
#include "stdio.h"
void main(){
int a =0;
int *p = NULL;
p = &a;
printf("%d\n",*p);
printf("%p\n",p);
}
当给一个指针变量取地址的时候,其实等价于给指针变量指向的变量取地址
&*p = & a;
而*&a的作用与*p的作用一样,运算之后都是变量a
*p++与(*p)++,++与*的运算优先级是一样的,所以在操作的时候根据需要的结果,注意括号的使用
3.数组与指针
指针存放的是地址,而数组中的每个元素也有对应的地址,当一个指针存放的是数组中元素的地址时,就是数组元素的指针也就等价于数组元素的地址。
int a[10]; int *p; p = &a[9];把最后一个数组元素的地址赋值给一个指针变量
这时可以通过指针变量引用数组元素 *(p + i)
#include<stdio.h>
void main()
{ int a[10];
int i;
for(i=0;i<10;i++ )
scanf(″%d″,&a[i]);
printf(″\n″);
for(i=0;i<10;i++)
printf(″%d″,*(a+i));
}
数组名可以作为函数的参数,同样指针变量名也可以替换数组名作为函数参数名max(int arr[])等价于 max(int *p)
这时的函数传递值是地址而不是值传递
4.指向函数的指针
可以用指针指向基本的数据类型,同样也可以用指针指向一个函数。
当一个函数在编译时会分配一个入口地址,这个地址就是函数的指针
函数指针的常用用途是把其作为参数传递给其他函数
int max(int (*f1)(int a ), int (*f2)(int b))
其中f1与f2就是函数指针,它们是作为形参被函数max调用的。
一个函数可以返回一个整型值、字符值、实型值等,也可以返回指针型的数据,即地址。
int *max (int a)
注意区分指针函数与函数指针的概念,以及它们的括号使用
5.指向指针的指针
int **p,这种形式等价于int * (*p)
#include "stdio.h"
void main(){
char *arr[] = {"sdf","wecoom"};
char **p;
for (int i = 0;i<2; i++)
{
p = arr + i;
printf("%s\n",*p);
}
}
6.指针数组
如果一个数组中的元素都是指针类型的数据,这个数组就是一个指针数组。
int *p【2】
指针数组的一个重要应用是作为main函数的形参。
void main(int argc,char *argv[ ])
argc和argv就是main函数的形参。main函数是由操作系统调用的。
下面总结一下指针各种表现形式
int a;
int *p; p = &a;
int a[1]; p = a ;
int *p[1];指针数组
int (*p)[1];数组指针
int max();
int *max();指针函数
int (*max)();函数指针
int **p;指向指针的指针
指针的赋值问题:
将一个变量地址赋给一个指针变量p。如:
p=&a; (将变量a的地址赋给p)
p=array; (将数组array首元素地址赋给p)
p=&array[i];(将数组array第i个元素 的地址赋给p)
p=max;(max为已定义的函数,将max的入口 地址赋给p)
p1=p2;(p1和p2都是指针变量,将p2的 值赋给p1)
指针变量可以有空值,即 p == NULL;
如果两个指针变量都指向同一个数组中的元素,则两个指针变量值之差是两个指针之间的元素个数
若两个指针指向同一个数组的元素,则可以进行比较。指向前面的元素的指针变量“小于”指向后面元素的指针变量。
也可以定义一种void类型的指针,选用动态存储分配函数的时候返回一个void型指针,但是再赋值给另一个指针的时候需要强制转换类型
char *p; void * q;
p = (char * )q;