码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2015-08-28 21:36:34      阅读:212      评论:0      收藏:0      [点我收藏+]

标签:指针常量与常量指针   指针与数组   指针与函数   指向指针的指针   void指针   


内容简介:
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))
{
    //调用函数指针p
    int result = p(a, b); //ab在此处是实际参数,传入到函数指针p指向的函数中
    return result;
}
  

int main(int argc, const char * argv[]) {
   
    //main中使用函数指针testFun
    int result;
    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)函数指针有什么作用?



版权声明:本文为博主原创文章,未经博主允许不得转载。

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

标签:指针常量与常量指针   指针与数组   指针与函数   指向指针的指针   void指针   

原文地址:http://blog.csdn.net/wing_n/article/details/48056763

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!