指针声明
int * pi;
char *pc;
float *pf,*pg;
#include <stdio.h> void as(int *, int *); int main (void) { int a = 2; int b = 3; as(&a,&b); printf("a=%d,b=%d",a,b); return 0; } void as(int *a, int *b) { int c,d; c = *a + *b; d = *a * *b; *a = c; *b = d; }
对指针变量的操作
#include <stdio.h> int main (void) { int urn[5] = {100,200,300,400,500}; int *ptr1,*ptr2,*ptr3; ptr1 = urn;//把一个地址赋给指针 ptr2 = &urn[2];//同上 //去的指针指向的值 //并且得到指针的地址 //urn++;++urn;错误,urn是个常量不是变量,不能如此操作 printf("pointer value,dereferenced pointer,pointer address:\n"); printf("ptr1 = %p,*ptr1 = %d,&ptr1 = %p\n",ptr1,*ptr1,&ptr1); //指针加法 ptr3 = ptr1 + 4; printf("\nadding an int to a pointer:\n"); printf("ptrl + 4 = %p, *(ptr1 + 3) = %d\n",ptr1 + 4,*(ptr1+3)); ptr1++;//递增指针 printf("\nvalues after ptrl++\n"); printf("ptrl = %p, *ptrl = %d, &ptrl1 = %p\n",ptr1,*ptr1,&ptr1); ptr2--;//递减指针 printf("\n values after --ptr2\n"); printf("ptr2 = %p,*ptr2 = %d,&ptr2 = %p\n",ptr2,*ptr2,&ptr2); --ptr1;//恢复为初始值 ++ptr2;//同上 //一个指针减去另一个指针 printf("\nPointers reset to original values:\n"); printf("ptr2 = %p,ptrl = %p,ptr2-ptr1 = %d\n",ptr2,ptr1,ptr2-ptr1); //一个指针减去一个整数 printf("\nsubtracting an int from a pointer:\n"); printf("ptr3 = %p,potr3 - 2 = %p\n",ptr3,ptr3 - 2); return 0; }
对指针的8种操作
1.赋值
把一个地址赋给指针。通常使用数组名或地址运算符&来进行地址赋值。
2.求值或取值
运算符*可取出指针指向地址中存储的数值。
3.取指针地址
指针变量同其他变量一样具有地址和数值,使用运算符&可以得到存储指针本身的地址。
4.将一个整数加给指针
可以使用+运算符来把一个整数加给一个指针,或者把一个指针加给一个正数。两种情况下,这个整数都会和指针所指类型的字节数相乘,然后所得的结果会加到初始地址上。
5.增加指针的值
可以通过一般的加法或增量运算符来增加一个指针的值。对指向某数组元素的指针做增量运算,可以让指针指向该数组的下一个元素。
6.从指针中减去一个整数
可以使用-运算符来从一个指针中减去一个整数。指针必须是第一个操作数,或者是一个指向整数的指针。这个整数都会和指针所指类型的字节数相乘,然后所得的结果会从初始地址中减掉。
7.减小指针的值
指针当然也可以做减量运算。
8.求差值
可以求出两个指针间的差值。通常对分别指向同一个数组内两个元素的指针求差值,以求出元素之间的距离。差值的单位是相应类型的大小。
//常量数组
const int a[2] = {1,2};
//非常量数组
int b[2] = {3,4};
//普通指针(不能指向常量数据)
int *c = a;//合法
int *c = b;//不合法(不能把常量数组地址赋给非常量指针)PS:可能能编译通过,但是不合法
//常量指针(指向常量的指针)
const int *d = a;//合法
const int *d = b;//合法
*d = 1;//非法,指向的内容是常量,不可修改,放在常量区
d = &b[1]//合法,指针本身可以修改
//指针常量(指针为常量)指针常量定义时必须初始化
int const *e;//非法,必须初始化
int const *e = a;//合法
int const *e = b;//合法
*e = 1;//合法,指向的内容可修改
e = &b[1]//非法,指针本身为常量不可修改
//既是常量指针又是指针常量
const int const *e;//非法,必须初始化
const int const *f = a;//合法
const int const *f = b;//合法
*f = 1;//非法,指向的内容为常量不可修改
f = &b[1];//非法,指针本身为常量不可修改
使用2个const声明指针可以确保地址不变并且能确保指针指向地址的值也不被改变
//一个指向2维数组的指针
int zippo[4][2] = {{2,4},{6,8},{1,3},{5,7}};
int(*pz)[2];//正确声明2维数组指针(指向由2个int值构成的数组)
int zippo[4][3] = {{2,4,1},{6,8,1},{1,3,2},{5,7,3}};
int(*pz)[3];//正确声明2维数组指针(指向由3个int值构成的数组)
//int *pz[2]//错误,这个表达式是声明了由2个指向int值的指针构成的数组
int zippo[4][2] = {{2,4},{6,8},{1,3},{5,7}};
printf("zippo = %p,zippo +1 = %p,*(zippo+1) = %p\n",zippo,zippo + 1,*(zippo+1));
printf("&zippo[0][0] = %p,zippo[0] = %p,zippo[0] + 1 = %p,*(zippo[0]+1) = %d\n",&zippo[0][0],zippo[0],zippo[0]+1,*(zippo[0]+1));
printf("*zippo = %p, *zippo + 1 = %p,*(*zippo+1) = %d\n",*zippo,*zippo + 1,*(*zippo+1));
printf("zippo[0][0] = %d\n",zippo[0][0]);
printf("*zippo[0]=%d\n",*zippo[0]);
printf("**zippo = %d",**zippo);
printf("zippo[2][1] = %d\n",zippo[2][1]);
printf("*(*(zippo*2)+1) = %d\n",*(*(zippo+2)+1));
显示
zippo = 0028FEF0,zippo +2= 0028FF00,*(zippo+1) = 0028FEF8
&zippo[0][0] = 0028FEF0,zippo[0] = 0028FEF0,zippo[0] + 1 = 0028FEF4,*(zippo[0]+1) = 4
*zippo = 0028FEF0, *zippo + 1 = 0028FEF4,*(*zippo+1) = 4
zippo[0][0] = 2
*zippo[0]=2
**zippo = 2zippo[2][1] = 3
*(*(zippo*2)+1) = 3
复合文字
普通数组声明方式
int diva[2] = {10,20};
复合文字的声明方式
int *diva;
diva = (int[2]){10,20}
以上两者意思是基本相同的,声明了一个数组
复合文字的用途个人理解是类似下面的用法
//函数原型
int sum(int ar[],int n);
//调用
sum((int []){4,4,4,4,4,4,4,5},6)
不声明数组直接使用数组,的一种匿名数组的声明方式
#include <stdio.h> #define COLS 4 int sum2d(int ar[][COLS],int rows); int sum(int ar[],int n); int main (void) { int total1,total2,total3; //声明一个1个int长度的指针 int * pt1; //声明一个COLS个int长度的指针 int (*pt2)[COLS]; pt1 = (int [2]) { 10,20 }; pt2 = (int [2][COLS]) { {1,2,3,-9}, {4,5,6,-8} }; total1 = sum(pt1,2); total2 = sum2d(pt2,2); total3 = sum((int []) { 4,4,4,5,5,5 },6); printf("total1 = %d\n",total1); printf("total2 = %d\n",total2); printf("total3 = %d\n",total3); return 0; } int sum(int ar[], int n) { int i; int total = 0; for(i = 0; i < n; i++) total += ar[i]; return total; } int sum2d(int ar[][COLS],int rows) { int r; int c; int tot = 0; for(r = 0; r < rows; r++) for(c = 0; c <COLS; c++) tot += ar[r][c]; return tot; }
http://www.51testing.com/?uid-39211-action-viewspace-itemid-80306