C语言指针

 

1    定义指针变量
    指针是C语言中非常重要的数据类型,指针变量的实质是内存地址。其定义的格式为:数据类型 *指针变量名; 比如int *p;

void change(int *n);
    // 格式:变量类型 *变量名;
    // 定义了一个指针变量p
    // 指针变量只能存储地址
    // 指针就一个作用:能够根据一个地址值,访问对应的存储空间
    // 指针变量p前面的int:指针变量p只能指向int类型的数据
int main()
{
    
    /*先定义后赋值
        int a = 10;
        int *p;
        p = &a;  //赋值
        printf(“%d”, *p);
        *p = 9;   //修改值
    */

   
    /* 定义的同时赋值
        int a = 10;
        int *p = &a;
    
      // 清空指针
        p = 0;
      // p = NULL;
    
       // 清空指针后,不能再间接访问其他存储空间
       // *p = 100.7;
    */
    
    
    /*实现修改实参
        int a = 90;
    
        change(&a);
    
        printf("%d\n", a);
    */

    /* 不建议的写法, int *p只能指向int类型的数据
        int *p;
        double d = 10.0;
        p = &d;*/
    
    /* 指针变量只能存储地址
        int *p;
        p = 200;
    */
    
    /* 指针变量未经过初始化,不要拿来间接访问其他存储空间
        int *p;
        printf("%d\n", *p);
    */
 
    /*任何指针都占用4个字节的存储空间
    char c; // 1
    int a; // 4
    long b; // 8
    
    
    char *cp;
    int *ap;
    long *bp;
    
    printf("cp=%d, ap=%d, bp=%d\n",
           sizeof(cp),
           sizeof(ap),
           sizeof(bp)); 
    */  
    return 0;
}

void change(int *n)
{
    *n = 10;
}

2    指针与数组

    数组名其实质是一个指针,但是它和普通的指针变量还是有区别的,数组名是指针常量

int main()
{
    int ages[5] = {10, 9, 8, 67, 56};   
    int *p;

    // 指针变量p指向了数组的首元素
    // 数组名就是数组的地址,也是数组首元素的地址
    p = ages;
    //p = &ages[0];  
    /*
     p ---> &ages[0]
     p + 1 ---> &ages[1]
     p + 2 ---> &ages[2]
     p + i ---> &ages[i]
     */ 

    //访问数组元素 
	/*
	 1.数组元素的访问方式
	 int ages[5];
	 int *p;
	 p = ages;
	 1> 数组名[下标]  ages[i]
	 2> 指针变量名[下标] p[i]
	 3> *(p + i)
	 
	 2.指针变量+1,地址值究竟加多少,取决于指针的类型
	  int *   4
	  char *  1
	  double * 8
	 */

    printf("%d\n",  *(p+2));    
    printf("%d\n",  p[2]);

    return 0;
}

3    指针与字符串

    字符串除了可以用字符数组保存外,用字符指针也可以表示一个字符串。
1 利用数组
char name[] = "itcast";
* 特点:字符串里面的字符是可以修改的
* 使用场合:字符串的内容需要经常修改

2 利用指针
char *name = "itcast";
* 特点:字符串其实是一个常量字符串,里面的字符是不能修改
* 使用场合:字符串的内容不需要修改,而且这个字符串经常使用

int main()
{
    //字符指针 
    char *name = "itst";
    // 字符指针数组(字符串数组)
    char *names[5] = {"jack", "rose", "jake"};
    
    printf("%s\n", name);
    printf("%s\n", names[0]);

    return 0;
}

4    指向函数的指针

    函数作为一段程序,在内存中也要占据部分存储空间,它也有一个起始地址,即函数的入口地址。指针变量就是用来存储地址的。因此,可以利用一个指针指向一个函数。其中,函数名就代表着函数的地址。 定义的一般形式:函数的返回值类型 (*指针变量名)(形参1, 形参2, ...); 由于这类指针变量存储的是一个函数的入口地址,所以对它们作加减运算(比如p++)是无意义的

int sum(int a, int b)
{
    return a + b;
}

int main()
{
    // 定义指针变量指向sum函数
    // 左边的int:指针变量p指向的函数返回int类型的数据
    // 右边的(int, int):指针变量p指向的函数有2个int类型的形参
    int (*p)(int, int);    
    p = sum;
    
    //两种调用方式
    int c = p(10, 11);    
    c = (*p)(10, 11);   
    
    printf("c is %d\n", c);
        
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值