• C语言讲义——数组和指针


    数组名表示的是这个数组的首地址。即如果有int a[10],则a 相当于&a[0]。

    #include <stdio.h>
    main() {
    	int a[5]= {1,3,5,7,9};
    	printf("数组a[]的地址为:%d
    ",a);
    
    	for(int i=0; i<10; i++) {
    		printf("a[%d]的地址为:%d 
    ",i, &a[i]);
    	}
    }
    

    运行结果:

    数组a[]的地址为:6487600
    a[0]的地址为:6487600
    a[1]的地址为:6487604
    a[2]的地址为:6487608
    a[3]的地址为:6487612
    a[4]的地址为:6487616
    a[5]的地址为:6487620
    a[6]的地址为:6487624
    a[7]的地址为:6487628
    a[8]的地址为:6487632
    a[9]的地址为:6487636
    

    指针操作数组元素

    #include <stdio.h>
    main() {
    	int  a[]= {1,3,5,7,9};
    	int *p = NULL;
    
    	p = a;
    	printf("数组名赋值给指针:%d
    ", *p);
    
    	p = &a[0];
    	printf("指针指向数组首元素:%d
    ", *p);
    
    	p = &a[2];
    	printf("针指向数组任意元素:%d
    ", *p);
    
    	// 指针加上整数,相当于数组下标加上整数
    	//  p+j = a[i+j]
    	printf("指针加上整数:%d
    ", *(p+1));// a[2+1]
    }
    

    运行结果:

    数组名赋值给指针:1
    指针指向数组首元素:1
    针指向数组任意元素:5
    指针加上整数:7
    

    指针遍历数组

    #include <stdio.h>
    main() {
    	int a[5]= {1,3,5,7,9};
    	int nLen = sizeof(a)/sizeof(int);
    	int *p=a;
    	int *q;
    	q=p;
    
    	for(p; p-q<nLen; p++) {
    		printf("%d ",*p);
    	}
    }
    

    函数封装版:

    #include <stdio.h>
    
    void printArray(int *p,int len) {
    	int *q = p;
    	for(p; p-q<len; p++) {
    		printf("%d ",*p);
    	}
    
    	printf("
    ");
    }
    
    main() {
    	int a[5]= {1,3,5,7,9};
    	printArray(a, 5);
    }
    

    指针版求字符串长度

    #include <stdio.h>
    #include <string.h>
    int myStrlen(char *s) {
    	int n = 0;
    	while(*s !='') {
    		n++;
    		s++;
    	}
    	return n;
    }
    
    main() {
    	char str1[200];
    	strcpy(str1,"大话西游2");
    	printf("%d
    ", myStrlen(str1));
    	printf("%s", (str1));
    }
    

    指针版字符串常量

    “指针版”字符串常量可像数组一样输出,不能修改,但可以直接赋值。

    #include <stdio.h>
    main() {
    	char astr[] = "hello world";// 普通字符串常量(即字符数组)
    	char *pstr = "hello world";// 指针版字符串常量
    
    	// “指针版”可像数组一样输出
    	printf("%c %c", astr[0], pstr[0]);
    
    	//X:“指针版”不能修改:pstr[0] = 'c';
    	astr[0] = 'c';
    
    	printf("
      %s
    ", pstr);
    	printf("
      %s
    ", astr);
    
    	//X:字符数组不能直接赋值:astr = "wellcome c";
    	pstr = "wellcome to c";// “指针版”可以直接赋值
    	printf("
      %s
    ", pstr);
    }
    

    指针版字符串复制

    #include <stdio.h>
    void copy_str(char *strFrom , char *strTo) {
    	while(*strFrom != '') {
    		*strTo = *strFrom;
    		strTo ++;
    		strFrom ++;
    	}
    	*strTo = '';
    }
    
    main() {
    	char* strFrom = "一生事业总成空,
    半世功名在梦中。
    死后不愁无勇将,
    忠魂依旧守辽东。";
    	char strTo[200] = {0};
    	copy_str(strFrom, strTo);
    	puts(strTo);
    }
    

    字符串转置

    #include <stdio.h>
    #include <string.h>
    main() {
    	char str[] = "pool";
    	char *p1 = str;
    	char *p2 = str + strlen(str) - 1;
    
    	char  temp ;
    	while (p1 < p2) {
    		temp = *p1;
    		*p1 = *p2;
    		*p2 = temp;
    		p1++;
    		p2--;
    	}
    	puts(str);
    }
    

    指针数组

    指针的数组。

    #include <stdio.h>
    main() {
    	char* pName[] = {"1.关胜","2.林冲","3.秦明","4.呼延灼","5.董平"};
    	printf("指针长度:%d 
    ", sizeof(char*));
    	printf("指针数组长度:%d 
    ", sizeof(pName));
    
    	int i;
    	for( i= 0; i<5; i++) {
    		puts(pName[i]);
    	}
    	puts("---------------");
    	char* temp = pName[0];
    	pName[0] = pName[4]; // 改变指向
    	for( i= 0; i<5; i++) {
    		puts(pName[i]);
    	}
    	printf("temp = %s", temp);
    }
    

    运行结果:

    指针长度:8
    指针数组长度:40
    1.关胜
    2.林冲
    3.秦明
    4.呼延灼
    5.董平
    ---------------
    5.董平
    2.林冲
    3.秦明
    4.呼延灼
    5.董平
    temp = 1.关胜
    
  • 相关阅读:
    Rocky Linux8国内镜像源
    强制缓存和协商缓存的区别
    从源码来看VUE的执行流程
    plugin
    判断数据类型的方法
    获取函数参数
    BFC
    VUE的$nextTick
    HTTP
    JavaScript创建和触发自定义事件
  • 原文地址:https://www.cnblogs.com/tigerlion/p/11191620.html
Copyright © 2020-2023  润新知