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

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

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

	for(int i=0; i<10; i++) {
		printf("a[%d]的地址为:%d \n",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\n", *p);

	p = &a[0];
	printf("指针指向数组首元素:%d\n", *p);

	p = &a[2];
	printf("针指向数组任意元素:%d\n", *p);

	// 指针加上整数,相当于数组下标加上整数
	//  p+j = a[i+j]
	printf("指针加上整数:%d\n", *(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("\n");
}

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 !='\0') {
		n++;
		s++;
	}
	return n;
}

main() {
	char str1[200];
	strcpy(str1,"大话西游2");
	printf("%d\n", 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("\n  %s\n", pstr);
	printf("\n  %s\n", astr);

	//X:字符数组不能直接赋值:astr = "wellcome c";
	pstr = "wellcome to c";// “指针版”可以直接赋值
	printf("\n  %s\n", pstr);
}

指针版字符串复制

#include <stdio.h>
void copy_str(char *strFrom , char *strTo) {
	while(*strFrom != '\0') {
		*strTo = *strFrom;
		strTo ++;
		strFrom ++;
	}
	*strTo = '\0';
}

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 \n", sizeof(char*));
	printf("指针数组长度:%d \n", 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.关胜
posted @ 2019-07-15 21:22  虎老狮  阅读(222)  评论(0编辑  收藏  举报