黑马程序员---iOS基础---C语言中的指针

------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;




 



























评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值