黑马程序员----C 语言学习笔记之数组指针与字符串指针

------Java培训、Android培训、iOS培训、.Net培训--------

一、数组指针的概念及定义

1.数组指针

指向一个数组的指针。

 

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

 

3.数组指针定义:

int *p;

 

4.数组指针的初始化

Inta[] = {1,2,3,4};

Int *p = a;//数组指针的初始化,指针变量p指向数组的第一个元素

Int * p =  &a[0];等价于上一句

 

5.p+1 表示访问数组a的第二个元素,同理p+1表示访问第二个元素

 

6.误区

   p + 1不是地址的值加1。而是p的地址值加上存储单元的长度

p+1 = p + 1*(sizof(数据类型))

例如:

	    int a[] = {1,2,3,4};
	    int *p = a;
	    printf("p = %p\n", p);
	    printf("p+1 = %p", p+1);

打印结果:


p = 0x7fff5fbff900
p+1 = 0x7fff5fbff904


7.对与一个一位数组来说
       7.1 获取a[i]的地址有几种方法
A, &a[i]
B. a+i
C.int *p =a; p + I
D.*(&a[i])
 
8.指针的应用---逆序数组
 
用指针将数组a中的呢个整数按反序存放
 
例如:a [] = {1,2,3,4};存放成4,3,2,1


	void reverse(int a[], int len){
	    int i = 0, j = len -1;
	    int *p = a;
	    
	    while (i < j) {
	        int temp = *(p + i);
	        *(p + i) = *(p + j);
	        *(p + j) = temp;
	        
	        i++;
	        j--;
	    }
	}
	
	void show(int a[], int len){
	    for (int i = 0; i < len; i++) {
	        printf("%d ", a[i]);
	    }
	    printf("\n");
	}
	
	int main(int argc, const char * argv[])
	{
	
	    int a[] = {1,2,3,4,5,6,7,8,9,10,11};
	    int len = sizeof(a)/sizeof(int);
	    printf("Before reverse:");
	    show(a, len);
	    
	    reverse(a, len);
	    printf("After reverse :");
	    show(a, len);
	
	
	    return 0;
	}

打印结果:
Before reverse:1 2 3 4 5 6 7 8 9 10 11 
After reverse :11 10 9 8 7 6 5 4 3 2 1 

9.一维指针数组

一个数组的元素值为指针则是指针数组

格式: 类型说明符 *数组名[length]

 

例如 int *p[5]; 注意这个指针数组只能存储int型的指针

 

 9.1 指针数组的使用

Int a = 3, b = 4, c= 5;

Int * p[3] ={&a, &b, &c};

 

例如:

int a = 3, b = 4, c = 5;
    
    int *p[] = {&a, &b, &c};
    printf("&a = %p\n", &a);
    printf("*p = %p\n", *p);//存储的是a的地址
    printf("p = %p\n", p); //指针数组的首地址
打印结果
&a = 0x7fff5fbff904
*p = 0x7fff5fbff904
p = 0x7fff5fbff8e0


又如
    int a[][2] = {1,2,3,4};
    
    int *p[2] = {a[0],a[1]};
    printf("a = %p\n", a);
    printf("&a[0] = %p\n", &a[0]);
    printf("*p = %p\n", *p);//存储的是数组a的首地址
    printf("**p = %d\n", **(p + 1)); // (p + 1)取的是p[1]的地址,*(p+1)取得是a[1]地址,**(p+1)是去a[1]的值
    printf("p = %p\n", p); //指针数组的首地址
打印结果


a = 0x7fff5fbff8f0
&a[0] = 0x7fff5fbff8f0
*p = 0x7fff5fbff8f0
**p = 3
p = 0x7fff5fbff8e0

10.指针变量之间运算

两指针变量相减所得之差事两个指针所指数组元素之间相差的元素个数。实际上是两个指针值(地址)相减之差 再除以该数组元素的长度(占用字节数)

10.1两个指针之间的减法运算

A.常见用法:两个指针都指向同一个数组

判断两个指针变量指向的元素是否连续

判断两个指针变量之间间隔几个元素

例如:

int a[][2] = {1,2,3,4};
	    
	    int *p = a[0];
	    int *p2 = a[1];
	    
	    printf("p = %p\n", p);
	    printf("p2 = %p\n", p2);
	    printf("p2 - p = %ld", p2 -p);

打印结果:
p = 0x7fff5fbff8f0
p2 = 0x7fff5fbff8f8
p2 - p = 2


10.2注意事项

A.两个指针之间的减法前提是两个指针都指向同一个数组中的元素

B.两个指针之间是没有加法的,因为相加后很有可能越界


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值