第六节--指针

  1. 指针的理解

指针是我们在学习c语言的一个难点,但是指针难不是难在概念而是难在指针是关于内存的分配,当我们定义一个变量的时候就会有相应的内存地址,就是指向我们存储数据的内存地址。这就是指针,意思是通过它能找到以它为地址的内存单元。

#inlcude <stdio.h>
int main(){
	int a = 10;//内存中开辟一块空间
	int *p = &a;//这里我们队变量a取出他的地址,使用&取地址符
	return 0;
}
  1. 指针和指针的类型
    这里我们在讨论一下:指针的类型 我们都知道,变量有不同的类型,整形,浮点型等。那指针有没有类型呢? 准 确的说:有的。
    当有这样的代码:
int num = 10;
 p = &num

要将&num(num的地址)保存到p中,我们知道p就是一个指针变量,那它的类型是怎样的呢? 我们给指针变量 相应的类型。

char  *pc = NULL;
 int   *pi = NULL;
  short *ps = NULL; 
  long  *pl = NULL; 
  float *pf = NULL;
   double *pd = NULL;

这里可以看到,指针的定义方式是: type + * 。 其实: char* 类型的指针是为了存放 char 类型变量的地 址。 short* 类型的指针是为了存放 short 类型变量的地址。 int* 类型的指针是为了存放 int 类型变量的 地址。

3.指针和数组名
在《数组》章节我们打印了数组的每个元素的地址,我们知道了数组在内存中是连续存放的。
现在我们在研究一下:数组名,数组和指针
数组名是什么?我们看一个例子

#include <stdio.h> 
int main() {
    int arr[10] = {1,2,3,4,5,6,7,8,9,0};
        printf("%p\n", arr);
   	printf("%p\n", &arr[0]);
     return 0;
   }

可见数组名和数组首元素的地址是一样的。
结论:数组名表示的是数组首元素的地址。

int arr[10] = {1,2,3,4,5,6,7,8,9,0};
int *p = arr;//p存放的是数组首元素的地址
  1. 指针运算

·指针± 整数
·指针-指针
·指针的关系运算

#define N_VALUES 5 
float values[N_VALUES]; 
float *vp; 
//指针+-整数;
指针的关系运算 
for (vp = &values[0]; vp < &values[N_VALUES];) 
{
     *vp++ = 0; 
}

指针-指针

int my_strlen(char *s) {
       char *p = s;
       while(*p != '\0' )              
       p++;       
       return p-s; 
       }

指针的关系运算

for(vp = &values[N_VALUES-1]; vp >= &values[0];vp--) {    
	*vp = 0;
	 } 
  1. 指针和数组
    既然可以把数组名当成地址存放到一个指针中,我们使用指针来访问一个就成为可能。
    例如:
#include <stdio.h>
 
int main() {   
		int arr[] = {1,2,3,4,5,6,7,8,9,0};    
		int *p = arr; //指针存放数组首元素的地址    
		int sz = sizeof(arr)/sizeof(arr[0]);    
		for(i=0; i<sz; i++)    {        
				printf("&arr[%d] = %p   <====> p+%d = %p\n", i, &arr[i], i, p+i);    
				}    
				return 0; 
		} 

所以 p+i 其实计算的是数组 arr 下标为i的地址。
那我们就可以直接通过指针来访问数组:

int main() {    
			int arr[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 };    
			int *p = arr; //指针存放数组首元素的地址    
			int sz = sizeof(arr) / sizeof(arr[0]);    
			int i = 0;    
			for (i = 0; i<sz; i++)    {        
					printf("%d ", *(p + i));    
					}    
			return 0; 
		}
  1. 二级指针
    指针变量也是变量,是变量就有地址,那指针变量的地址存放在哪里? 这就是 二级指针 。
    在我们学习数据结构中将会大量使用二级指针,因为我们需要去修改一个一级指针中的内容就导致我们需要去使用二级指针去操作一级指针 中的内容
int b = 20; 
*ppa = &b;//等价于 pa = &b;
**ppa = 30; 
//等价于*pa = 30; //等价于a = 30; 

重点

这里我们介绍一个重要的知识点:关于指针数组和数组指针的内容
指针数组:重点在于数组两字,他是一个数组,但是数组中的每一个元素都是一个指针,例如:int* p [10] 上面就是一个指针的数组,它的每一个元素都是一个int类型的指针
数组指针:重点在于指针,他是一个指针,但是他指向的是一个数组元素,例int (*p)[10],他是一个指针p,指向的是一个int类型长度为10的数组。

猜你喜欢

转载自blog.csdn.net/boke_fengwei/article/details/85376229