当前位置: 首页 > article >正文

指针C语言基础代码总结

《charpointer》

字符指针

demo1.c
字符指针的初始化及赋值

#include <stdio.h>

int main(int argc, char *argv[])
{
        char ch = 'A';               //字符变量

        char * p;

        p = &ch;                       //指针等于变量取地址

        printf("%c %c\n", ch, *p);

        return 0;
}

上下两个程序联合想明白,指针 1. 直接指向字符串
2. 指针指向字符数组
两种赋值方法需要注意的问题

demo2.c

字符数组初始化字符指针

#include <stdio.h>
#include <ctype.h>

int main(int argc, char *argv[])
{
        char ch1[] = "hello World!";             //字符数组
        char ch2[] = "hello World!";             // 两个字符串在内存中的不同位置
                                     //同一个指针可以指向两个不同的字符串数组,且可以通过指针对字符串数组中的内容进行修改
        char * p;

        p = ch1;
        //ch1[0]---*(ch1+0)----p[0], *p
        if(isalpha(*p)) {                            // 判断字母
                if (isupper(*p))                     // 大写
                        *p = tolower(*p);            // 转小写
                else
                        *p = toupper(*p);            //转大写
        }
        printf("%p %s\n", p, p);                     

        p = ch2;
        printf("%p %s\n",p, p);

        return 0;
}

demo3.c

重要

#include <stdio.h>
#include <ctype.h>

int main(int argc, char *argv[])
{
        char * p1 = "hello World!";         // 字符指针指向一个字符串常量,指针存储了字符串常量的起始地址,那么就不能通过指针去修改字符串中的内容,因为字符串的地址确定后不能改变(字符串实际放到了一个固定的区域,静态存储区,这个地方的值不能修改)
        char * p2 = "hello World!";             

        *p1 -= 32;           //不能这样使用,会出现段错误

        printf("&p1=%p %p %s\n", &p1, p1, p1);   // 不同的指针有自己的地址,但指向的是同一个地址   p1、p2是局部变量,存放在栈中,“全局变量,static修饰的局部变量,字符串常量”,三种情况数据存放在静态区,这个区域是程序结束时才释放内存,一旦分配后永远占据内存

        printf("&p2=%p %p %s\n", &p2, p2, p2);    

        return 0;
}

demo4.c
解释的依然是上面程序中遇到的问题

#include <stdio.h>
#include <string.h>

int main(int argc, char *argv[])
{
        char ch[50] = "welcome";
        char * p1 = "hello World!";
        
        strcpy(ch, p1);
       // strcpy(p1, ch);          // 错误  p1指针指向的是一个字符串,不能被改变 

        puts(ch);
        puts(p1);

        return 0;
}

demo5.c

不利用任何字符串函数,编程实现字符串连接函数功能 ( 重要 )

#include <stdio.h>
//#include <string.h>

int main(int argc, char *argv[])
{
        char ch[100] = "welcome";
        char * p = "hello World!", * q;
        int i = 0;

        q = p;

        while (*(ch+i) != '\0') 
                i++;

        while (*p != '\0') {
                *(ch+i) = *p;
                i++;
                p++;
        }
        *(ch+i) = *p;

        p = q;
        puts(ch);
        puts(p);

        return 0;
}

先学习

《pointer》
指针的基本使用和理解
d1.c

#include <stdio.h>

int main(int argc, char *argv[])
{
        int a = 10;
        int * p;
        int * q;

        p = &a;                                  //指针存放的是变量的地址
        //q = &a;   
        q = p;                                   //指针之间可以相互赋值

        printf("&p:%p %d\n", &p, sizeof(p));     //指针所存放的字节数
        printf("%p %p\n", p, &a);
        printf("%d %d\n", a, *p);                //*p 即变量 a 所指代的内容

        printf("\n\n&q:%p %d\n", &q, sizeof(q));  // 变量 变量的地址 指针存储变量的地址 指针的地址           p 和 q 的地址不同,原因是变量不同,其分配的内存空间也不同,但p和q存储的数据相同--a地址
        printf("%p %d\n", q, *q);

        return 0;
}

d2.c

#include <stdio.h>

int main(int argc, char *argv[])
{
        double a;
        double * p;

        p = &a;

        printf("%d %d %p\n", sizeof(double), sizeof(p), p);     // 指针所占字节数和电脑系统是32位还是64位有关系,32位,每个指针占4个字节

        return 0;
}

d3.c

指针的运算

#include <stdio.h>

int main(int argc, char *argv[])
{
        int a = 10, * p;
        double b = 3, * q;

        p = &a;
        q = &b;

        printf("%p %p\n", p, p+2);             // +2越过2个数据,每个数据4个字节,那就是在首地址的基础上+8
        printf("%p %p\n", q, q+2);

        return 0;
} 

d4.c

#include <stdio.h>

int main(int argc, char *argv[])
{
        int a[5] = {4, 8, 1, 2, 7};
        int *p, * q;

        p = a; //&a[0];
        q = &a[3];
        
        printf("%p %p\n", p, q);
        printf("%d %d\n", *p, *q);
        printf("%d\n", q-p);                     //两个指针相减表示两指针之间相隔的数据的个数

        return 0;
}

d5.c
指针++

#include <stdio.h>

int main(int argc, char *argv[])
{
        int a[5] = {4, 8, 1, 2, 7};
        int *p = NULL, *q;              // 指针和 0 进行等于或不等于的关系运算,判断指针是否为空

        printf("%d %p\n", p, p);        // 0(nil)
        p = a; //&a[0];
        
        printf("%p %d\n", p, *p);

        q = p++;

        printf("%p %d\n",p, *p);               //到这p已+1
        printf("%p %d\n",q, *q);


        return 0;
}

结果:
在这里插入图片描述

d6.c

第一次循环通过指针给数组赋值,给最后一个元素赋完值后,指针变量指到数组后的内存单元,此时已经超出了数组的大小限制,所以在第二次循环打印出的时候,需要重新 修正p = a;

#include <stdio.h>

#define N 5
int main(int argc, char *argv[])
{
        int a[N];
        int *p, i;
        
        p = a;//int *p = a;
        for (i = 0; i < N; i++) 
                scanf("%d", p++);//&a[i]

        p = a;
        for (i = 0; i < N; i++)  {
                printf("%d ", *p);    //可以写为*p++    (++的优先级高于 * 的优先级)
                p++;
        }
        puts("");


        return 0;
}

d7.c

#include <stdio.h>

#define N 5
int main(int argc, char *argv[])
{
        int a[N];
        int *p, i;
        
        p = a;//int *p = a;
        for (i = 0; i < N; i++) 
                scanf("%d", p++);//&a[i]

        p = a;
        for (i = 0; i < N; i++)  {
                printf("%d ", *p++);
        }
        puts("");


        return 0;
}

d8.c

数组和指针结合
指针指向数组的起始地址,数组是一串连续的空间,指针++就可以访问数组中每个元素的值

#include <stdio.h>

int main(int argc, char *argv[])
{
        int a[] = {1, 6, 9, 12, 61, 12, 21};
        int *p, i, n;
        
        p = a;
        n = sizeof(a) / sizeof(int);

        printf("%p %p %p\n", a, a+1, a+2);

        for (i = 0; i < n; i++)
                printf("%d %d %d %d\n", a[i], *(p+i), *(a+i), p[i]);   //四种等价方式的运用
        puts("");              //输出换行符的方式

        p++;

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

        return 0;
}


上面四种等价方式的直观图解
数组名也是一个地址,只不过是地址常量,其+1也可以实现地址移动

d9.c
将整形数组中n个数按反序存放

#include <stdio.h>

int main(int argc, char *argv[])
{
        int a[] = {1, 6, 9, 12, 61, 12, 21};
        int *p, *q, n, t;

        n = sizeof(a) / sizeof(int);

        p = a;
        q = &a[n-1];

        while (p < q) {
                t = *p;
                *p = *q;
                *q = t;
                p++;
                q--;
        }
        
        for (t = 0; t < n; t++)
                printf("%d ", a[t]);
        puts("");


        return 0;
}

d10.c

指针与二维数组
使用一级指针遍历二维数组

#include <stdio.h>

int main(int argc, char *argv[])
{
        int a[3][2] = {{1, 6}, {9, 12}, {61, 12}};
        int * p, i, n;

        n = sizeof(a) / sizeof(int);

        p = a[0]; //&a[0][0];
        printf("%p %p\n", p, p+1);                   // 指针p+1 一次只加一个数据,但是(a+1)数组名+1,一次加的是一行的数据
        printf("%p %p\n", a, a+1);

        for (i = 0; i < n; i++)
                printf("%d ", *(p+i));         // 二维数组遍历要使用两层循环,但使用指针,只需要一层  printf("%d\n",a[i][j]); 相同,注意四种通用的方法,即用数组的遍历方法,根据其和指针之间等价的表达关系,利用指针去遍历
        puts("");
        
        return 0;
}

d11.c

#include <stdio.h>

int main(int argc, char *argv[])
{
        int a[3][2] = {{1, 6}, {9, 12}, {61, 12}};
        int * p, i, n;

        n = sizeof(a) / sizeof(int);

        //a[1]++;                                 数组名是常量,不能做算数运算
        //printf("%d\n", sizeof(a[1]));           a[1]也代表的是数组名

        p = a[0]; //&a[0][0];
        printf("%p %p\n", p, p+1);
        printf("%p %p\n", a, a+1);

        for (i = 0; i < n; i++)
                printf("%d ", *(p+i));
        puts("");


        return 0;
}

在这里插入图片描述

d12.c

#include <stdio.h>

int main(int argc, char *argv[])
{
        int a[3][2] = {{1, 6}, {9, 12}, {61, 12}};
        int * p, i, n;

        n = sizeof(a) / sizeof(int);

        printf("%p %p\n", a, a+1);
        //printf("%p %p\n", a[0], a[0]+1);   a[0]指二维数组中第一个一维数组名,a[0]+1 指一维数组a[0]中的下一个数据,这个地方可以解释上面一个程序图片中的内容,
       // a[0] + 1 = *(a + 0) + 1;
        printf("%p %p\n", *a, *a+1);  // 等价 printf("%p %p\n", a[0], a[0]+1);


        return 0;
}

d13.c

行指针

#include <stdio.h>

int main(int argc, char *argv[])
{
        int a[3][2] = {{1, 6}, {9, 12}, {61, 12}};
        int (*p)[2], i, j;                 //定义方式

        p = a;

        printf("%p %p\n", a, a+1);
        printf("%p %p\n", p, p+1);         //定义行指针这样表示,p+1 和 a+1 所移动的地址就是相同的

        //printf("%d, %d, %d, %d\n", a[1][1], p[1][1], *(*(a + 1)+1), *(*(p + 1) + 1));
        for (i = 0; i < 3; i++) {
                for (j = 0; j < 2; j++)
                        printf("%d, %d, %d, %d ", a[i][j], p[i][j], *(*(a + i)+j), *(*(p + i) + j));                   //不是很理解真正的用处在哪,感觉差不多
                puts("");
        }


        return 0;
}

《指针二 parray》

demo1.c

#include <stdio.h>

int main(int argc, char *argv[])
{
        int * p[3];//int *     --   p[0] p[1] p[2]
        int a[] = {3, 6, 1, 9, 10};

        p[0] = a;
        p[1] = a + 1;
        p[2] = a + 3;


        printf("%d %d %d\n", a[0], a[1], a[3]);
        printf("%d %d %d\n", *(p[0]), *(p[1]), *p[2]);


        return 0;
}

demo2.c

#include <stdio.h>

int main(int argc, char *argv[])
{
        int a[2][3] = {{1, 4, 6}, {12, 9, 7}};//a----a[0]   a[1]

        int * p[2];


        p[0] = a[0];//&a[0][0] 
        p[1] = a[1];//&a[1][0]

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

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



        return 0;
}

demo3.c

#include <stdio.h>

int main(int argc, char *argv[])
{
        int a[2][3] = {{1, 4, 6}, {12, 9, 7}};//a----a[0]   a[1]
        int * p[2] = {a[0], a[1]};
        int i, j;


        //printf("%p %p\n", p[0], a[0]);
        //printf("%p %p\n", p[1], a[1]);

        for (i = 0; i < 2; i++) {
                for (j = 0; j < 3; j++) 
                        //printf("%d %d ", *(a[i] + j), *(p[i]+j));
                        printf("%d %d ", *(*(a+i) + j), *(*(p +i)+j));
                puts("");
        }


        return 0;
}

demo4.c

#include <stdio.h>

int main(int argc, char *argv[])
{
        int a[2][3] = {{1, 4, 6}, {12, 9, 7}};//a----a[0]   a[1]
        int * p[2] = {a[0], a[1]};
        int i, j, sum = 0;

        int *  * q;

        q = p;//&p[0]

        printf("total:%d\n", sizeof(p));
        //printf("%p %p\n", p[0], a[0]);
        //printf("%p %p\n", p[1], a[1]);

        for (i = 0; i < 2; i++) {
                for (j = 0; j < 3; j++) 
                        sum += *(p[i]+j);
                        //printf("%d %d ", *(a[i] + j), *(p[i]+j));
                     //   printf("%d %d ", *(*(a+i) + j), *(*(p +i)+j));
                //puts("");
        }

        printf("sum=%d\n", sum);

        return 0;
}

《 pp 》

demo1.c

#include <stdio.h>

int main(int argc, char *argv[])
{
        int m = 10;
        int * p;

        //....   * q;
        int* * q;

        p = &m;

        q = &p;

        printf("%p %p\n", p,&m);
        printf("%p %p\n", q,&p);
        printf("%d %d %d\n", m, *p, **q);

        printf("%p %p\n", q, q + 1);

        return 0;
}

demo1.c

#include <stdio.h>

int main(int argc, char *argv[])
{
        int a[] = {3, 6, 9};
        int * p[2] = {&a[0], &a[1]};//int * ---  p[0]  p[1]

        int ** q;

        q = &p[0];//p
        q = p;

        printf("%d %d\n", a[0], a[1]);
        printf("%d %d\n", *p[0], *p[1]);

        printf("%d %d %d\n", a[0], *p[0], **q);
        printf("%d %d %d\n", a[1], *p[1], **(q+1));





        return 0;
}

demo1.c

#include <stdio.h>

int main(int argc, char *argv[])
{
        //char * s1 = "apple";
        //char * s2 = "pear";
        char * s[] = {"apple", "pear", "potato"};
        char ** p;
        int i, n;

        i = 0;
        n = sizeof(s) / sizeof(char *);
        p = &s[0];//p = s;

        while (i < n){
                printf("%s %s\n", s[i], *(p + i));
                i++;
        }

        return 0;
}

《void_const》

const1.c

#include <stdio.h>

int main(int argc, char *argv[])
{
        const int m = 10;

        m++;

        return 0;
}

const2.c

#include <stdio.h>

int main(int argc, char *argv[])
{
         int m = 10;
         const int * p;
         int * const q = &m;
         const int * const r = &m;
         
         p = &m;//right;

         //(*p)++; error;

         //q = &m; error;
         *q = 20;//right

         r++;
         (*r)++

        return 0;
}

demo1.c

#include <stdio.h>

int main(int argc, char *argv[])
{
        int m = 10;
        double n = 3.14;
        void * p, * q;

        p = &m;//(void *)&m;
        printf("%d %d\n", m, *(int *)p);
        printf("%p\n", p);
        p++;
        printf("%p\n", p);

        q = &n;//(void *)&n;
        printf("%.2lf %.2lf\n", n, *(double *)q);
        printf("%p\n", p);
        q++;
        printf("%p\n", q);




        return 0;
}

demo2.c

#include <stdio.h>

int main(int argc, char *argv[])
{
        int a[] = {5, 9, 1, 6, 9, 10};
        int i, n;
        void * p;

        p = a;
        n = sizeof(a) / sizeof(int);
        for (i = 0; i < n; i++) 
                printf("%d ", *((int *)p + i));
        puts("");

        return 0;
}

demo3.c

#include <stdio.h>

int main(int argc, char *argv[])
{
        int a[] = {5, 9, 1, 6, 9, 10};
        int i, n;
        void * q;
        int * p;

        q = a;
        p = (int *)q;
        n = sizeof(a) / sizeof(int);
        for (i = 0; i < n; i++) 
                printf("%d ", *(p + i));
        puts("");

        return 0;
}

main.c

#include <stdio.h>

int main(int argc, const char * argv[]) {
        //const char * argv[] = {"./a.out", "192.168.1.5", "9999"};
        int i;

        printf("argc=%d\n", argc);

        for (i = 0; i < argc; i++) {
                printf("%s\n", argv[i]);
        }

        return 0;
}


http://www.kler.cn/a/9684.html

相关文章:

  • Autosar CP DDS规范导读
  • Unity3D学习FPS游戏(11)敌人AI巡逻(NavMesh)
  • 【Python】爬虫通过验证码
  • Typescript类型运算符、关键字以及内置高级类型
  • Java-Redisson分布式锁+自定义注解+AOP的方式来实现后台防止重复请求扩展
  • 力扣 LeetCode 27. 移除元素(Day1:数组)
  • 图嵌入 Node2Vec
  • 前端开发必看100道大厂面试题集锦(一)
  • 网站怎么接入chatGPT来自动写文章
  • python【反爬、xpath解析器、代理ip】
  • ZooKeeper领导者选举流程
  • 子集和问题
  • 华为OD机试-通信误码-2022Q4 A卷-Py/Java/JS
  • 【教程】解决VSCode中Python第三方库无法自动补全
  • Segment Anything论文阅读笔记
  • HummerRisk 使用教程:操作审计
  • Qt·核心机制
  • 商汤科技推出“日日新SenseNova”,大模型体系赋能人工智能新未来
  • Elasticsearch:ESQL 简介 — 一种用于灵活、迭代分析的新查询语言
  • 使用模板窗口生成测试数据
  • TypeScript由浅到深(上篇)
  • 工程管理系统软件 自主研发,工程行业适用
  • 【国内chatgpt最全使用方法合集】(总有一个适合你)
  • GaussDB行存储表列存储表相关
  • 本地安装WSL的发行版后,导出到另一台计算机安装的办法
  • 自然语言处理(七): Deep Learning for NLP: Recurrent Networks