一个变量的地址称作该变量的“指针”
指针就是通过地址体现的
-----------------------------------------------------------------------------------------------------------
#include<stdio.h> int main(){ int a,b; int * p1,* p2; a = 10; b = 20; p1 = &a;//变量a的地址赋值给指针p1 p2 = &b; //输出指针变量所指向的整型变量的值 //p1代表指针变量本身,*p1代表指针所指向内存的内容 printf("*p1 = %d,*p2 = %d",*p1,*p2); return 0; }
交换两个指针的地址
#include<stdio.h> int main(){ int a=5,b=9; int * p1,* p2, * temp; p1 = &a; p2 = &b; if(a<b){ //交换的指针所指向的地址 temp = p1; p1 = p2; p2 = temp; } printf("a = %d,b = %d\n",a,b); printf("*p1 = %d,*p2 = %d\n",*p1,*p2); } /* 原值a,b并没有发生改变 output: a = 5,b = 9 *p1 = 9,*p2 = 5 */
交换两个指针所指向变量的值
#include<stdio.h> int main(){ int a=5,b=9,temp; int * p1,* p2; p1 = &a; p2 = &b; if(a<b){ //交换指针变量 temp = *p1; *p1 = *p2; *p2 = temp; } printf("a = %d,b = %d\n",a,b); printf("*p1 = %d,*p2 = %d\n",*p1,*p2); } /* 原值发生改变 output: a = 9,b = 5 *p1 = 9,*p2 = 5 */
野指针
int *p;//避免没有权限的地址操作,指针需要先有地址 *p=1;
指针与地址
int main(void){ int x=1,y=2,arr[10]; int *pp;//指向int类型的指针 pp=&x;//pp指向变量x的地址 printf("x = %d,y = %d,pp = %d\n",x,y,*pp); *pp = *pp + 1; printf("x = %d,y = %d,pp = %d\n",x,y,*pp); y = *pp + 1; ++*pp;//*pp++错误写法,运算符遵循从右往左顺序 (*pp)++; printf("x = %d,y = %d,pp = %d\n",x,y,*pp); return 0; } /* output: x = 1,y = 2,pp = 1 x = 2,y = 2,pp = 2 x = 4,y = 3,pp = 4 */ int main25(void){ int x=1,y=2,arr[10]; int *pp;//指向int类型的指针 pp=&x;//pp指向变量x的地址 *pp = 10;//x的值为10 printf("x = %d,y = %d\n",x,y); y = *pp;//指针pp所指向变量的值赋给y printf("x = %d,y = %d\n",x,y); *pp = 100; printf("x = %d,y = %d\n",x,y); arr[0] = 1; pp = &arr[0]; printf("x = %d,y = %d,pp = %d\n",x,y,*pp); return 0; } /*output: x = 10,y = 2 x = 10,y = 10 x = 100,y = 10 x = 100,y = 10,pp = 1 */指针与数组
int main(void){ int arr[10] = {0,1,2,3,4,5,6,7,8,9}; int *pa = arr; int i; for(i = 0;i<sizeof(arr)/sizeof(int);i++){ //pa+i=arr[i] their address is equals printf("*pa = %d\n",*(pa+i)); } for(i = 0;i<sizeof(arr)/sizeof(int);i++){ //arrys is pointer printf("arr[%d] = %d\n",i,*(arr+i)); } for(i = 0;i<sizeof(arr)/sizeof(int);i++){ //bath method,their address is equals printf("%p,%p\n",&arr[i],arr+i);//arr不是变量,不能arr++/a=pp操作 } return 0; } /*output: *pa = 0 *pa = 1 *pa = 2 *pa = 3 *pa = 4 *pa = 5 *pa = 6 *pa = 7 *pa = 8 *pa = 9 arr[0] = 0 arr[1] = 1 arr[2] = 2 arr[3] = 3 arr[4] = 4 arr[5] = 5 arr[6] = 6 arr[7] = 7 arr[8] = 8 arr[9] = 9 0x7ffcf91e2b00,0x7ffcf91e2b00 0x7ffcf91e2b04,0x7ffcf91e2b04 0x7ffcf91e2b08,0x7ffcf91e2b08 0x7ffcf91e2b0c,0x7ffcf91e2b0c 0x7ffcf91e2b10,0x7ffcf91e2b10 0x7ffcf91e2b14,0x7ffcf91e2b14 0x7ffcf91e2b18,0x7ffcf91e2b18 0x7ffcf91e2b1c,0x7ffcf91e2b1c 0x7ffcf91e2b20,0x7ffcf91e2b20 0x7ffcf91e2b24,0x7ffcf91e2b24 */使用指针计算字符串长度
int mstrlen(char *pc); int main(void){ printf("%d\n",mstrlen("hello")); return 0; } int mstrlen(char *pc){ int len; for(len=0;*pc!='\0';pc++){ len++; } return len; }