C语言-06复杂数据类型-03指针

本文深入讲解了指针变量的定义及应用,包括如何通过指针修改外部变量、实现多返回值,以及指针与数组、字符串的操作技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

指针变量的定义

变量类型 *变量名;

#include <stdio.h>
int main()
{
    // 指针就一个作用:能够根据一个地址值,访问对应的存储空间
    // 指针变量p前面的int:指针变量p只能指向int类型的数据
    int *p; // 定义了一个指针变量p
int a = 90; p = &a; // 指针变量p指向了变量a 指针变量只能存储地址
    *p = 10;  //这里的*与定义指针变量时的*不同,它表示访问对应的存储空间
    a = 20;
    
    printf("%d\n", *p);
    
    return 0;
}

指针相关

/*
 %d int
 %f float\double
 %ld long
 %lld long long
 %c char
 %s 字符串
 %zd  unsigned long
 */
#include <stdio.h>
int main()
{ 
    char *cp;
    int *ap;
    long *bp;
    
    printf("cp=%zd, ap=%zd, bp=%zd\n",
           sizeof(cp),
           sizeof(ap),
           sizeof(bp));
// 任何指针都占用8个字节的存储空间 64位编译器 思考下为什么指针要分类型 (计算机根据指针的类型来确认从内存中取多少个字节的内容) }

 

 

练习

//根据指针  在函数内部修改外部的变量
#include <stdio.h>
void change(int *p);
int main()
{
    int a =10;
    change(&a);
    printf("a=%d\n",a);
    return 0;
}
void change(int *p)
{
    *p = 20;
}

 

//利用指针让函数间接的有多个返回值 
#include <stdio.h>
int main()
{
    int a = 15;
    int b = 10;
    int he=0,cha=0;
    test(a,b,&he,&cha);
    printf("和是%d,差是%d",he,cha);
}
void test(int a,int b,int *c,int *d)
{
    *c = a+b;
    *d = a-b;
}

 指针与数组

#include <stdio.h>

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

int main()
{
    // 20个字节
    int ages[5] = {10, 11, 19, 78, 67};
    
    change(ages);
    
    return 0;
}

// 利用一个指针来接收一个数组,指针变量array指向了数组的首元素
void change(int *array)
{
    printf("%d\n", array[2]);
    //printf("%d\n", *(array+2));
}

/*
void change(int array[])
{
    int s = sizeof(array);
    
    printf("%d\n", s);
}*/

void test()
{
    double d = 10.8;
    double *dp;
    dp = &d;
    
    printf("dp = %p\n", dp);
    printf("dp + 1 = %p\n", dp + 1);
    
    int ages[5] = {10, 9, 8, 67, 56};
    
    int *p;
    // 指针变量p指向了数组的首元素
    p = &ages[0];
    // 数组名就是数组的地址,也是数组首元素的地址
    //p = ages;
    
    /*
     p ---> &ages[0]
     p + 1 ---> &ages[1]
     p + 2 ---> &ages[2]
     p + i ---> &ages[i]
     */
    
    //printf("%d\n",  *(p+2));
    
    printf("%d\n",  p[2]);
    
    /*
     for (int i = 0; i<5; i++) {
     printf("ages[%d] = %d\n", i, *(p+i));
     }*/
    
    
    //    printf("%p\n", p);
    //    printf("%p\n", p + 1);
    //    printf("%p\n", p + 2);
}

 指针与字符串

#include <stdio.h>

/*
 1.常量区
    存放一些常量字符串
 2.堆
    对象
 3.栈
   存放局部变量
 
 掌握:
 定义字符串的2种方式
 1> 利用数组
 char name[] = "itcast";  // 字符串变量
  * 特点:字符串里面的字符是可以修改的
  * 使用场合:字符串的内容需要经常修改

    //char name[] = "it";
    //name[0] = 'T';
    //printf("%s\n", name);
    // "it" == 'i' + 't' + '\0'
 
 2> 利用指针
  char *name = "itcast";  // 字符串常量
  * 特点:字符串其实是一个常量字符串,里面的字符是不能修改
  * 使用场合:字符串的内容不需要修改,而且这个字符串经常使用,它被缓存起来,新定义指针是不在开内存空间的
 
   // char *name2 = "it";
    //char *name3 = "it";
    
    //*name2 = 'T'; //程序会崩溃 它是常量不能修改
    
    //printf("%c\n", *name2);  // 指针变量name2指向了字符串的首字符
    
    printf("%p\n%p\n", name2, name3); //不开新空间 地址相同
    
    //printf("%s\n", name2); //直到遇到\0
 */

int main()
{
    char name[20];
    
    printf("请输入姓名:\n");
    
    scanf("%s", name);
    
    // 'j' 'a' 'c' 'k' '\0'
    
    //printf("%c\n", name[3]);
    
    //printf("刚才输入的字符串是:%s\n", name);
    
    return 0;
}

// 定义字符串数组
void test2()
{
    char *name = "jack";
    
    //int ages[5];
    
    // 指针数组(字符串数组)
    char *names[5] = {"jack", "rose", "jake"};
    
    // 二维字符数组(字符串数组)
    char names2[2][10] = {"jack", "rose"};
}

 

转载于:https://www.cnblogs.com/iedo/p/5045122.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值