您的位置:首页 > 移动开发 > IOS开发

IOS 学习之二指针

2017-02-16 22:08 134 查看

指针

....


数组指针

/*
是指向数组元素的指针,本质是一个指针。
作用:
使用数组指针间接访问数组的元素
定义:
int *p;
初始化:
int a[4]={1,2,3,4};
int *p = a;//定义了一个指针 p 指向了a这个数组的第一个元素。此时 p 就是一个数组指针
或
int *p = &a[0]
*/
int a[4]={1,2,3,4};
printf("&a[0] = %p\n",&a[0]);
printf("&a[1] = %p\n",&a[1]);
printf("&a[2] = %p\n",&a[2]);

int *p = a;
printf("    p = %p\n",p);//p指向了数组 a 的第一个元素
printf("p + 1 = %p\n",p+1);//p+1 表示偏移的下一个元素
printf("--------分割 1--------\n");

//通过数据指针取得内存中对应存储单元的内容
printf(" *(p+1) = %d\n",*(p+1));
printf(" *(a+1) = %d\n",*(a+1));
printf("--------分割 2--------\n");

//使用数组指针和使用数组名的区别
printf(" *p++ = %d\n",*p++);
printf(" *p = %d\n",*p);
p--;
printf("--------分割 3--------\n");
//用数据指针遍历数组;
for (int i = 0;  i < 4; i++) {
printf("%d\t",*(p+i));//未改变了 p 的指向
}
printf("\n");

for (int i = 0;  i < 4; i++) {
printf("%d\t",*p++);//改变了 p 的指向
}
printf("\n");


结果

&a[0] = 0x7fff5fbff740
&a[1] = 0x7fff5fbff744
&a[2] = 0x7fff5fbff748
p = 0x7fff5fbff740
p + 1 = 0x7fff5fbff744
--------分割 1--------
*(p+1) = 2
*(a+1) = 2
--------分割 2--------
*p++ = 1
*p = 2
--------分割 3--------
1   2   3   4
1   2   3   4
Program ended with exit code: 0


使用指针逆序数组

int len=10;

int a[]={1,2,3,4,5,6,7,8,9,10};
int *p=a;
for (int i = 0; i<len/2; i++) {
int t=*(p+i);
*(p+i)=  *(p+len-1-i) ;
*(p+len-1-i)=t;
}
for (int i = 0; i<len; i++) {
printf("%d\t",*(p+i));
}


指针数组

是一个有序的指针的集合,本质是一个数组。
指针数组的所有元素都必须是具有相同存储类型和指向相同数据类型的指针变量。
指针数组的一般形式:类型说明符 *数据名[数据长度]


int a;//int 变量
int *a;//int 类型的指针变量
int a[5];//int 类型的数组
int *p=a;//p 为数组指针
int *a[5];// int类型的指针数组,只能存放 int 类型的数据的地址


int a = 3, b = 4, c = 5;
int *pa[3]={&a,&b,&c};
printf(" &a   = %p\n",&a);
printf("*pa   = %p\n",*pa);
printf(" pa   = %p\n",pa);
printf("pa[0] = %p\n",pa[0]);
printf("&pa   = %p\n",&pa);
printf("----------\n");
//访问a b 的值
printf("*(&a)     = %d\n",*(&a));
printf("a         = %d\n",a);
printf("**pa      = %d\n",**pa);
printf("**(pa+1)  = %d\n",**(pa+1));
printf("*pa[0]    = %d\n",*pa[0]);

int d[2][2] = {1,2,3,4};
int *pd[2]={d[0],d[1]};//pd/pd[0]为 d[0]的地址,pd+1/pd[1]为 d[1]的地址
printf("**pd    = %d\n",**pd);
printf("**(pd+1)= %d\n",**(pd+1));


结果

&a   = 0x7fff5fbff70c
*pa   = 0x7fff5fbff70c
pa   = 0x7fff5fbff740
pa[0] = 0x7fff5fbff70c
&pa   = 0x7fff5fbff740
----------
*(&a)     = 3
a         = 3
**pa      = 3
**(pa+1)  = 4
*pa[0]    = 3
**pd    = 1
**(pd+1)= 3


指针变量之间的运算

注:只有指向同一数组的两个指针变量之间才能进行计算,否则无意义。

int a[5]={1,2,3,4,5};
int *p =a ;
int *p1=&a[1];
int *p2=&a[2];

/*
若两个指针变量相减的结果是 1 的绝对值,则是连续的。结果的正负性表明指针变量指向的地址的高低性。
若两个指针变量相减的结果是  0,则指向同一个地址。
*/
printf(" p1 > p =%d\n",p1>p);//1 p1 处于高地址,p 位于低地址
printf(" p2 -p1 =%ld\n",p2-p1);//1 p2 p1 指向的地址是连续的


数据名访问二维数组

int a[3][4]={1,3,5,7,9,11,13,15,17,19,21,23};
//列指针
//此时的 a[0]==&a[0][0] a[0]+1 ==&a[0][1] a[0]+2==&a[0][2]

printf("&a[0][1] = %p\n",&a[0][1]);
printf("&a[0] +1 = %p\n",a[0]+1);
printf("&a[0][2] = %p\n",&a[0][2]);
printf("&a[0] +2 = %p\n",a[0]+2);
printf("---------------\n");
//行指针
//a+1 第二行的首地址
//a+2 第三行的首地址
printf("a[1] = %p\n",a[1]);
printf("a+1  = %p\n",a+1);

//a+1 第二行第一个无素的地址
//*(a+1) == &a[1][0]

printf("*(a+1) = %p\n",*(a+1));
printf("&a[1][0] = %p\n",&a[1][0]);

printf("---------------\n");

//*(a[i]+j) 获取 a[i][j]
//a[i] ==*(a+i)
//*(*(a+i)+j)---->a[i][j]

printf("*(a[1]+3) = %d\n",*(a[1]+3));
printf("*(*(a+1)+3) = %d\n", *(*(a+1)+3));


结果

&a[0][1] = 0x7fff5fbff724
&a[0] +1 = 0x7fff5fbff724
&a[0][2] = 0x7fff5fbff728
&a[0] +2 = 0x7fff5fbff728
---------------
a[1] = 0x7fff5fbff730
a+1  = 0x7fff5fbff730
*(a+1) = 0x7fff5fbff730
&a[1][0] = 0x7fff5fbff730
---------------
*(a[1]+3) = 15
*(*(a+1)+3) = 15


二维数组指针

/*
数组指针
是指向一维数组元素的指针。

二维数组指针
是指向二维数据元素的指针。
是行指针,用来指向二维数组的一行,存放的是首先的地址。
一般形式:数据类型 (*指针变量名)[二维数组列表长度];
*/

int a[3][4]={1,3,5,7,9,11,13,15,17,19,21,23};
int (*p)[4]=a;//定义一个数组指针,指向二维数组a.
//使用
for (int i =0; i<3; i++) {
for (int j = 0; j<4; j++) {
printf("%d\t",*(*(a+i)+j));
}
printf("\n");
}
printf("---------\n");

for (int i =0; i<3; i++) {
for (int j = 0; j<4; j++) {
printf("%d\t",*(*(a+i)+j));
}
printf("\n");
}


结果

1   3   5   7
9   11  13  15
17  19  21  23
---------
1   3   5   7
9   11  13  15
17  19  21  23
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: