导航

【C语言】基础(九)指针

Posted on 2017-08-16 10:26  sucre_2  阅读(196)  评论(0编辑  收藏  举报

  ·

指针

指针:指针就是地址
指针变量:存放变量地址的变量
使用指针的目的:要通过指针能够找到被指的变量,或者说要通过指针间接访问被指的变量
取变量;栈区

int *p 指向int类型的指针
%p 输出指针

&取址符

初始化
int *p=NULL; 必须初始化

定义时放*(*p=&a),赋值时不能放(p=&a )
* 类型说明的作用
间接访问指针指向内存的值的作用

p=&a; 打印:p为地址,*p值为a




void 类型的指针
可以指向任何变量,但在使用时,需要进行强制类型转换之后才能使用

void *p=&a;
printf("%d",*(int*)p);



指针大小:都为8个字节

指针运算:只能加减、不能乘除

p+n = p+n*sizeof(指向类型)



指针访问数组

1、数组名实际上就是一个指向该数组中第一个元素的指针
2、在实际数组元素前面加一个&与 p=&a[1];
3、在数组名后加偏移量,改变指向的数组元素

*(p+n) = array[n] = *(array + n);
p[0] == array[0];可以这样

访问数组两种方式:
下标法访问 数组名[下标] 指针[下标]




const指针
const int* p 指针指向的变量不可改变、可以修改指向、其指向内存被const修饰不可改变
(const 在 * 左边,修饰int)
int const* p 值不可变

int *const p (const在*右边,修饰指针)指针不能改变指向

const int *const p 只能初始化,都不能改


const在星号左边:
修饰的是指针指向的内存
1.指针可以改变指向
2.不可以通过指针改变其所指内存的值

const在星号右边:
修饰的是指针变量本身
1.指针不可以改变指向
2.可以通过指针改变其所指内存的值

const在星号左右
1.不可以改变指向
2.不可以通过指针修改值


注意:变量本身仍可以通过变量名去修改



指针与字符串
字符数组表示字符串
用字符指针指向一个字符串表示,指向首地址

char* str1 = "beijing" str1仅记录首地址
beijing存在数据区(常量不能改),不能根据str1[1]=E;修改

strcat不能用指针拼接。
strcpy


指针与函数

指针变量作为函数参数:将指针变量以实参的形式传递给函数,进行的是地址的传递,所以可以在函数中改变实参的值

数组名作为函数的实参和形参:进行地址传递

函数的返回值是一个指针:函数的返回值类型必须定义为指针类型


函数指针:指向函数的指针

数据类型(*指针变量名) (形参列表)
int (*p)(int a) --int(* )(int a)指向返回值为Int的函数指针
int *p1(int a) -- (int*) (int a) 返回值为int*函数。函数名为p1
括号不能省
int *(*p2)(int*a,int*b) ----指向返回值为int*,参数为。。的函数指针

指向函数的指针变量的说明:
1、把函数首地址赋给指针变量时,直接写函数名即可,不用写括号和函数参数
2、利用指针变量调用函数时,要写明函数的实际参数

p=func1; p(20) == func1(20)
//函数名就是函数的首地址
//表示函数指针P指向func1

指针访问二维数组

int a[3][4];
int (*p)[3][4];
p=&a; *p == a;
(*p)[1][1];
p[0] ==*p;
p[0][0][0]=a[0][0]
p[0][1]=a[1];

指针的指针(二维指针)
如果一个指针变量存放的是又一个指针变量的地址,则称这个指针变量为指向指针的指针变量。

int a;
int *p=&a;
int **p=&p;
**p == a

指向数组的指针
定义:类型名称 (*指针名)[数组长度]
如:int a[5]={1,1,1,1,1};int (*p)[5]=&a;
定义时不加括号就成了指针数组,因为[]优先级比*高。
数组指针定义时的数组长度,元素类型需与指向的数组相同

int(*p)[5];指向数组长度为5的整型数组的指针
char* (*p1)[10];指向类型为char* [10]的数组指针
int *p2[10];一个数组 类型为int* [10]

数组指针指向的是整个数组,不是单个元素
数组指针加1,相当于p+sizeo(数组名)
访问数组元素:a[0],*a,*(a+1),(*p)[0],p[0][0] (*p)==a, p[0]=a;


指针(数组)
如果数组元素都是指针变量,构成指针数组
一般形式:类型名称 * 数组名[数组长度]
int* a[10];每个元素都是int* 指针