c语言初学-初涉指针
3674 点击·0 回帖
![]() | ![]() | |
![]() | 指针: 指针是一个 4 bytes Integers,保存的是内存地址, 1.定义: 类型 * 变量名: int * p;这样定义的话,p是有地址也有值,不过值是随机值 应该为其初始化: int * p = null; 不提倡不同类型的一起运用: char c = 'e'; int *p = &c; 也不提倡直接让其等于一个地址: int *p = 0xffff22; 2.使用const声明指针变量 1).指向const的指针变量 int const *p; 等效于 const int *p; 该类指针变量指向的内存空间的内容是不可变的。 eg. const int a = 1; const int * p = &a; a的值是不可以改变的 2).const型指针变量 int * const p; 指向的内存空间是固定的,初始化后不能将其指向其他空间,就是说p 不可以再等于其它的地址。 3).指向const的const指针变量 const int * const p; 该指针变量的值和该指针指向的空间的值都是不可以改变的。 3. [csharp] int a; int *p; p = &a; 这样是正确的,a的值是无效值,但是系统给它分配了内存空间了,地址是有效的。只有系统回收的和自己定义的是无效的。 4.指针形参 可以将一个内存空间的地址传递到函数中,通过该地址来操作改地址上的内存空间 声明方式:void func(int *p,int *q); eg: 把a和b值进行交换: 通常的方法:进行传值操作,这样是不能实现交换 [csharp] #include <stdio.h> #include<math.h> void swap(int,int); int main(){ int a = 1; int b = 2; swap(a,b); printf("a=%d b=%d\n",a,b); return 0; } void swap(int a,int b){ int temp = 0; temp = a; a = b; b = temp; printf("a= %d b=%d\n",a,b); } 正确的方法:进行传地址(指针)的操作,从而实现替换 [csharp] #include <stdio.h> #include<math.h> void exchange(int *,int *);//声明 int main(){ //定义两个int型数 int a = 5; int b = 7; printf("a=%d b=%d\n",a,b);//输出a和b的值 exchange(;a,;b);//调用 return 0; } void exchange(int *x,int *y){ int temp;//定义中间变量 temp = *x; *x = *y; *y = temp; printf("a=%d b=%d\n",*x,*y);//输出 } 5.指针型函数值 函数的函数返回值也可以是指针型的数据,即地址。 数据类型 * 函数名(形参列表); eg: [csharp] #include <stdio.h> int * max(int * ,int *);//声明 int main(){ int a = 1; int b = 2; int *p = NULL;//定义一个int型的指针来接收函数 add的返回值 p = max(;a,;b);//把地址传过去 printf("%d\n",*p);//输出 return 0; } int * max(int * a,int *b){ int *p = NULL;//初始化 if(*a>*b){ p =a; }else{ p = b; } return p; } 注意: 错乱时空: [csharp] float *mistake(){ float temp = 12; float *p = &temp; return p; } temp 只有在mistake这个方法块里面有效,当存在返回语句的时候,意味着在外界可能会使用也可能不会使用,所以会出现:有时候会出错误,有时候不会出错。。错乱www.atcpu.com 6.函数型指针 指向函数的指针,可以表示出函数的地址 有这样一个函数声明: int add(const int a,const int b); 使用该函数类型来定义一个函数型指针: int (*fq)(const int a ,const int b); 就是相当于把存有函数的地址的函数变量func赋给了fq这个 指针:fq = add; 注意:(*fq) 这个小括号千万不能省略 调用的两种方法:fq(3,3); 或 (*fq)(3,3) eg: [csharp] #include<stdio.h> int add(const int a,const int b){ return a + b; } int main(){ //定义函数指针 int (*fp)(const int a,const int b); //赋值 fp = add; //调用,输出 printf("%d\n",fp(3,4)); printf("%d\n",(*fp)(3,4)); //输出函数的地址 printf("%p\n",add); printf("%p\n",;add); printf("%p\n",fp); printf("%p\n",*fp); return 0; } 7.void型指针 可以指向存储任意数据类型的空间,也就是它包含了所有的 类型,常作为形参出现,它可以指向任意类型的指针变量;也 可以作为函数的函数值。 定义形式:void * 变量名; 8. 指针的调用:(一二三级指针的使用) [csharp] #include <stdio.h> #include<math.h> int main(){ int a =1; int *b; b = &a; printf("b的值(a的地址):%p\n",b); printf("a的值:%d\n",*b); printf("b的地址:%p\n",;b); printf("---------------------------\n"); int **q; q = &b; printf("q的值(b的地址):%p\n",q); printf("b的值(a的地址): %p\n",*q); printf("a的值:%d\n",**q); printf("q的地址:%p\n",;q); printf("---------------------------\n"); int ***r; r = &q; printf("r的值(q的地址):%p\n",r); printf("q的值(b的地址):%p\n",*r); printf("b的值(a的地址):%p\n",**r); printf("a的值:%d\n",***r); printf("r的地址: %p\n",;r); return 0; } | |
![]() | ![]() |