——黑马程序员——C语言中的指针(二)

-----------android培训java培训、java学习型技术博客、期待与您交流!-----------
指针与一维数组之间的关系

一、数组指针:指向数组首地址的指针

特点:
1、允许指针加一个整数,+1表示指针指向了数组当前元素相邻的下一个元素
2、允许指针减一个整数,-1表示指针指向了数组当前元素相邻的前一个元素
3、允许指针进行自增自减运算,如p++,++p、p--,--p
4、使用指针来循环遍历数组写法为 *(a+i)或者 *(p+i)a为数组名,p为指针,使用数组的下标来循环遍历数组,写法为:a[i]
5、当p1和p2都指向同一数组中的元素时,允许指针相减 ,值是数组地址的差值,可用于判断指针变量指向的元素是否连续,如果差值的绝对值为0则连续;
#include <stdio.h>
#include <stdlib.h>
int main()
{
	//定义一个数组
    int a[4] = {1,2,3,4};
    //定义一个指针并指向数组的首地址
    int *p = a; //也可以写成 int *p = &a[];
    int i;
    //打印出数组的每个元素
    for(i = 0; i < 4; i++)
    {
    printf("a[%d] = %d\n",i,a[i]);
    }
    //打印出地址
    printf("数组a的a[0]地址: = %p\n",&a[0]);
    printf("  数组a的首地址: = %p\n",a);    
    printf("    指针p的地址: = %p\n",p);
 
	system("pause");
	return 0;
}

#include <stdio.h>
#include <stdlib.h>
int main()
{
	//定义一个数组
    int a[4] = {1,2,3,4};
    //定义一个指针并指向数组的首地址
    int *p = a; //也可以写成 int *p = &a[];
    int i;
    //打印出数组的每个元素
    for(i = 0; i < 4; i++)
    {
    printf("a[%d] = %d\n",i,a[i]);
    }
    //打印出地址
    printf("数组a的a[0]地址: = %p\n",&a[0]);
    printf("  数组a的首地址: = %p\n",a);    
    printf("    指针p的地址: = %p\n",p);
    
    //指针p加减一个整数测试 
	printf("让指针p加1之后为:%d\n",*p+2);
    //指针p加减一个整数测试
	printf("让指针p加1之后为:%d\n",*p);    

		int j;
    //指针p自增自减
    for(j = 0; j < 4; j++)
    
    {
    printf("a[%d] = %d\n",j,*p++);
    }
	
	system("pause");
	return 0;
}

#include <stdio.h>
#include <stdlib.h>
int main()
{
	int a[5] = {1,2,3,4,5};
    int *p = a; // 定义一个指针并指向a
    //让p1指向数组的第四个元素
    int *p1 = p+3;
    printf("%d,%d\n",*p,*p1);
    //指针之间的减法运算,值为地址的差值
    printf("p1-p = %d\n",p1-p);
    
    printf("p1-p = %d\n",p-p1);          
	system("pause");
	return 0;
}

二、指针数组

指针数组:一个数组元素的值为指针则称为指针数组,指针数组是一组有序指针的集合。
一般形式:
类型说明符  * 数组名 [数组长度];例如:int *p [ 3 ] = {&a,&b,&c};
特点:p是数组的首地址,又是变量a的地址
#include <stdio.h>
#include <stdlib.h>
int main()
{
	int a = 3, b = 4, c = 5;
    //定义一个指针数组
	int *pa[3] = {&a,&b,&c};
    //打印数组的第一个元素的值
	printf("   &a = %p\n",&a);
    printf(" pa[0]= %p\n",pa[0]);
    
    //打印数组的首地址
	printf("   pa = %p\n",pa);
    printf("&pa[0]= %p\n",&pa[0]);    
	
    //打印出a的值
	printf(" *(&a)= %d\n",*(&a));
    printf("*pa[0]= %d\n",*(pa[0]));      
	system("pause");
	return 0;
}


#include <stdio.h>
#include <stdlib.h>
int main()
{
	int a = 3, b = 4, c = 5;
    //定义一个指针数组
	int *pa[3] = {&a,&b,&c};
    //打印数组的第一个元素的值
	printf("   &a = %p\n",&a);
    printf(" pa[0]= %p\n",pa[0]);
    
    //打印数组的首地址
	printf("   pa = %p\n",pa);
    printf("&pa[0]= %p\n",&pa[0]);    
	
    //打印出a的值
	printf(" *(&a)= %d\n",*(&a));
    printf("*pa[0]= %d\n",*(pa[0]));  
    
    //使用数组名访问a的值
	printf(" a = %d\n",**pa);

        
	system("pause");
	return 0;
}



















發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章