您的位置:首页 > 编程语言 > C语言/C++

C语言基础-指针与数组

2015-11-11 18:05 239 查看
1.数组指针

概念:指向数组元素的指针

作用:使用数组指针间接访问数组的元素

定义:

int *p;


初始化:

int a[4] = {1,2,3,4};
int *q = a;//定义了一个指针变量q,赋值数组的首地址(第一个元素的地址),q指向了数组的第一个元素
int *q = &a[0];//跟上面等价

数组指针如何去访问数组元素:

p+1 表示指向数组的下一个元素

p-1 表示指向数组的上一个元素

/*
对于一个一维数组来说
int a[5];
1)获取a[i]的地址有几种方法:
1.&a[i];
2.a+i;
3.int *p = a;
p+1;
2)获取a[i]的值有几种方法:
1.&a[i];
2.*(a+i);
3.int *p = a;
*(p+1);
4.*(&[i]);
*/
#include <stdio.h>

void nixuArray(int a[],int len){
int *p = a;//定义数组指针
int i = 0,j = len - 1;//定义下标
int temp;
while (i<j) {
//交换a[i]和a[j]
temp = *(p+i);
*(p+i)=*(p+j);
*(p+j)=temp;
//修改下标
i++,j--;
}

}

int main(int argc, const char * argv[]) {

int arr[10]={1,2,3,4,5,6,7,8,9,10};
nixuArray(arr, 10);//逆序数组
for (int i=0; i<10; i++) {
printf("%d\t",arr[i]);
}//遍历数组

return 0;
}
2.指针数组
一个数组元素的值是指针则是指针数组。指针数组是一组有序的指针的集合,指针数组的所有元素都必须是具有相同存储类型和指向相同数据类型的指针变量

一般格式:
类型说明符 *数组名[数组长度]
int *p[3];//p是一个指针数组,有3个数组元素,每个元素都是一个指针,指向整型变量
指针数组的使用:
int a=3,b=4,c=5;
int *p[3]={&a,&b,&c};

p[0] = a的地址
#include <stdio.h>

int main(int argc, const char * argv[]) {

int a=3,b=4,c=5;
int *p[3]={&a,&b,&c};
//打印指针数组的第一个元素的值
printf("&a    = %p\n",&a);
printf("p[0]  = %p\n",p[0]);
//打印指针数组的首地址
printf("p     = %p\n",p);
printf("&p[0] = %p\n",&p[0]);
//访问a的值 a=3
printf("*(&a)   = %d\n",*(&a));
printf("*(p[0]) = %d\n",*(p[0]));
//使用数组名来访问a的值
printf("**p     = %d\n",**p);
return 0;
}
&a    = 0x7fff5fbff7dc
p[0]  = 0x7fff5fbff7dc
p     = 0x7fff5fbff7f0
&p[0] = 0x7fff5fbff7f0
*(&a)   = 3
*(p[0]) = 3
**p     = 3


3.两个指针变量之间的运算
1)两个指针变量之间的减法运算

int a[4] = {1,2,3,4};
int *p1 = &a[0];
int *p2 = &a[3];
printf("p2-p1=%d\n",p2-p1);
运行结果:p2-p1=3
//如果两个指针指向同一个元素,相减的结果是 0
//如果两个指针指向相邻元素,相减的结果是 1的绝对值


            注意:两个指针变量之间没有加法运算,也没有乘法和除法 
        2)两个指针变量之间的关系运算
<pre name="code" class="cpp">    int a[4] = {1,2,3,4};
int *p1 = &a[0];
int *p2 = &a[3];
printf("p2>p1 = %d\n",p2>p1);//1 表示p2在高位
//0 表示p1在高位或指向同一位置
运行结果:p2>p1 = 1


4.数组名访问二维数组

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

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

printf("a+2     = %p\n",a+2);
printf("a[2]    = %p\n",a[2]);
运行结果:
<pre name="code" class="cpp">    &a[0][1]=0x7fff5fbff7c4
&a[0]+1 =0x7fff5fbff7c4
&a[0][2]=0x7fff5fbff7c8
&a[0]+2 =0x7fff5fbff7c8
a+1     = 0x7fff5fbff7d0
a[1]    = 0x7fff5fbff7d0
a+2     = 0x7fff5fbff7e0
a[2]    = 0x7fff5fbff7e0



                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  C语言 指针 数组