这一章节很重要,一定要多思考、理解!
指针是一种保存变量地址的变量。
通常的机器 都有一系列连续编号或编址的存储单元。一个字节可存char类型,两相邻字节存储单元可存一个short,依此类推。
p = &c; //将c的地址赋值给p,即p是指向c的指针。
地址运算符&只能应用于内存中的对象,即变量与数组元素,不能作用于表达式、常量或register类型的变量。
1 #include <stdio.h> 2 main(){ 3 int x = 1, y = 2,z[10]; 4 int *ip; //ip是指向int类型的指针 5 ip = &x; //ip指向x 6 y = *ip; //y=1 7 printf("%d ",y); //1 8 *ip = 0; //x=0 9 printf("%d ",x); //0 10 printf("%d ",y); //1 11 ip = &z[0]; //ip指向z[0] 12 printf("%d ",ip); //2686720 数组z的第一个元素的地址的值 14 }
1 #include <stdio.h> 2 main(){ 3 int x = 1, y; 4 int *ip; 5 int *z; 6 ip = &x; 7 printf("%d ", *ip); //1 8 y = *ip + 1; 9 printf("%d ",y); //2 10 *ip += 1; 11 printf("%d ",*ip); //2 12 printf("%d ",(*ip)++); //2 13 printf("%d ",++(*ip)); //4 14 z = ip; //指针z也指向ip所指向的对象 15 printf("%d ", *z); //4 16 }
1 #include <stdio.h> 2 3 main(){ 4 int i; 5 int a[10]; 6 int *p; 7 p = &a[0]; 8 printf("%d ", &i); //2686780 9 printf("%d ", a); //2686720 10 printf("%d ", &a[0]); //2686720 11 printf("%d ", &a[8]); //2686720 int按4字节算,&a[8] = 2686720 + 8 * 4 12 printf("%d ", p); //2686720 13 }
指针只能指向某种特定类型的对象,即每个指针都必须指向某种特定的数据类型。有一例外,void 类型的指针可存放指向任何类型的指针,但不能间接引用其自身。
//交换两值
1 #include <stdio.h> 2 void swap(int *px, int *py); 3 main(){ 4 int i = 1, j = 2; 5 printf("%d,%d ", i, j); //1,2 6 swap(&i, &j); 7 printf("%d,%d ", i, j); //2,1 8 } 9 void swap(int *px, int *py){ 10 int temp; 11 temp = *px; 12 *px = *py; 13 *py = temp; 14 }
一般来说,用指针编写的程序比用数组下标编写的程序执行速度要快。
int a[10]; //定义一个由10个对象组成的集合,这10个对象存储在相邻的内存区域中 ,分别为a[0] 、a[1]...
int *p;
p = &a[0]; //将指针p指向数组第一个元素,p的值是数组元素a[0] 的地址
//如果p指向数组中的某个特定元素,则p+1将指向下一个元素,p+i将指向p所指向数组元素之后的第i个元素。
//p指向a[0] ,*(p+1)引用的是数组元素a[1]的内容,*(p+i)=a[i]。
p = &a[0]; => p = a(数组名所代表的就是该数组的第一个元素的地址) => a[i] = *(a+i) => &a[i] = a+i
有点困,有点饶晕了,今晚学的有点少了,明天继续。晚安!
原文作者:lltong