您的位置:首页 > 编程语言 > C语言/C++

【C语言连载五】--------指针

2015-08-28 19:43 603 查看
内容简介:
1、指针常量与常量指针,
2、指针与数组,
3、指针与函数,
4、指向指针的指针,
5、*void指针

指针://也叫指针地址,即一块内存地址
注意:
指针若没有初始化就拿去用,是很危险的,程序会崩溃(crash)——>野指针调用

一、指针常量与常量指针
指针常量: 是指针,指向的地址不可变(eg: 数组)
常量指针: 指向常量。

二、指针与数组:
【1】用指针遍历数组:
    //遍历数组
    int a[] = {10,
20,
30, 40,
50};
   
int count =
sizeof(a) /
sizeof(int);

   

    //传统遍历

    for
(int
i = 0; i < count; i++) {

        printf("a[%d] is %d\n", i, a[i]);

    }

   

    //指针遍历

    int
*p = a;

   

    //不改变p的指向

    for
(int
i = 0; i < count; i++) {

        printf("a[%d] is %d\n", i, *(p + i));

    }

   

    //改变p的指向

    for
(int
i = 0; i < count; i++) {

        printf("a[%d] is %d\n", i, *p);

        p++;
    }
【2】*p++; *(p++); *(++p); ++(*p); (*p)++
 int a[] = {10,
20,
30, 40,
50};
int
*p = a;
//以下语句均单独运行:

printf("%d\n”, *p);  //10
printf("%d\n",
*(p++));  //10  先把p取出,*p,然后再++

printf("%d\n",
*p++);    //10  //与上一个的效果一样
printf("%d\n",
*(++p));  //20  //p指向第二个元素,即a[1],<==>*(p+1)或*(a+1)
printf("%d\n",
++(*p));  //11  //<==> ++a[0]
printf("%d\n",
(*p)++);  //11  //<==> a[0]++

【3】访问数组元素:
for(int i = 0; i< 5; i++){
   //四种方法,任一即可
   printf("%d\n”,
a[i]);
   printf("%d\n”, *(a + i));
   printf("%d\n”, *(p + i));
   printf("%d\n”, p[i]);

}
三、指针与函数:
【1】指针函数:是一个函数,返回值是指针
(1)//指针函数
char
* string(){
   
return
"wxhl";
}
    //调用:(main函数中)

    printf("wxhl is %s\n", string());
(2)//参数中带指针
void
sum(int
a,
int b,
int *result){
    *result = a + b;
}
    //调用:(main函数中)
    int
a =
10, b =
5,
result =
0;
   
int *p = &result;
    sum(a, b, p);
    printf("a = %d, b = %d, result = %d\n", a, b, result);
【2】函数指针:是指针,指向一个函数
【】#include
<stdio.h>

int
sum(int
a,
int b){//加法函数
   
return a + b;
}
int
minus(int
a,
int b){//减法函数
   
return a - b;

}

//在main函数中定义一个函数指针
//函数指针的类型取决于指向函数的返回值类型
int
(*p)(int,int)=sum;//<==>int
(*p)(int a,int b)= sum;

   

    //使用

   
int result = p(10,
20);

    printf("result is %d\n", result);

【】//我们可以将一个函数指针作为参数int
testFun(int
a,

int
b,
int
(*p)(int
a,

int
b))

{

   
[b]//
调用函数指针p[/b]
    int
[b]result = p(a, b);

//a、[/b]b在此处是实际参数,传入到函数指针p指向的函数中
   

[b]return
[/b]
result;
}
  

int
main(int
argc,
const
char * argv[]) {
   
   
//main中使用函数指针testFun
    [b]int
[b]result;
[/b][/b]
    result = testFun(8,
2, p);//p可换成sum
    printf("result is %d\n", result);

    result = testFun(8,
2, minus);

    printf("result is %d\n", result);

【】对于void函数,函数指针的使用:
   void
test()

{

    printf("hehe\n");
}
   
//定义一个函数指针,指向test函数

   
void (*p1)() = test;

   

    //使用

    p1();

四、指向指针的指针:

   
int a =
10;

   

    //指向数值的指针

   
int *p1 = &a;

   

    // p2中的指针地址,指向p1

   
int **p2 = &p1;

   
    printf("%d\n",**p2);
五、*void 指针
    /*void指针可以指向任意类型*/

    int
a =
10;
    char
*string =
"wxhl";
    printf("string is %s\n", string);
    
   
void *p1 = &a;  //指向数值的指针
   
   
void *p2 = string;  //指向字符串的指针
   
    printf("a = %d\n", *((int
*)p1));
    printf("string is %s\n", (char
*)p2);

五、QUestion
(1)什么是指针变量?

(2)怎么取出一个变量的指针地址,怎么取出指针指向的目标地址?

(3)如何通过指针遍历数组?

(4)什么是指针函数,什么是函数指针?

(5)什么是双重指针如何定义一个双重指针变量?

(6)数组中的数据元素在内存中是如何分配的?

(7)函数指针有什么作用?
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息