当前位置: 移动技术网 > IT编程>开发语言>C/C++ > c/c++ 指针 归纳一

c/c++ 指针 归纳一

2018年10月30日  | 移动技术网IT编程  | 我要评论

神话放送121013,360国际医疗网,中央8套节目预告

// cpp-test.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"

void print_array_elment(int a[3], int size)
{
	/*数组作为形参时,退化为指针,不能通过sizeof获取数组的内存大小 ,获取的是指针的大小,commented by zhaoyulong,2016.8.14*/
	printf("\n %s, sizeof(a):%d\n", __function__, sizeof(a));
	for (int i = 0; i < size; i++)
	{
		printf("a[%d]:%d ", i, a[i]);
	}
	printf("\n %s, end \n", __function__);
}

void print_array_elment_by_pointer(int *a, int size)
{
	/*数组作为形参时,退化为指针,不能通过sizeof获取数组的内存大小 ,获取的是指针的大小commented by zhaoyulong,2016.8.14*/
	printf("\n %s, sizeof(a):%d\n", __function__, sizeof(a));
	for (int i = 0; i < size; i++)
	{
		printf("a[%d]:%d ", i, a[i]);/*指针访问元素不仅有*a形式,该种也可以 ,commented by zhaoyulong,2016.8.14*/
	}
	printf("\n %s, end \n", __function__);
}

int max(int a, int b)
{
	return a > b ? a : b;
}


int main(int argc , char **argv)
{
	int *p3 = null;
	char *p4 = null;
	printf("sizeof(*p3):%d;sizeof(*p4):%d\n", sizeof(*p3), sizeof(*p4));
	printf("sizeof(p3):%d, sizeof(p4):%d \n",sizeof(p3),sizeof(p4));

	int a[5] = { 5,13,99 ,17,555};
	int *p = a;
	
	
	char a1[3] = { 'a','z','1' };
	char *p1 = a1;


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

	printf("\n访问数组元素的第一种方式:\n");
	for (int i = 0; i < sizeof(a) / sizeof(a[0]); i++)
	{
		printf("a[%d]:%d ", i, a[i]);
		a[i] = i + 1;		
	}

	printf("\n访问数组元素的第二种方式:\n");
	for (int i = 0; i < sizeof(a) / sizeof(a[0]); i++)
	{		
		printf("a[%d]:%d : ", i, *(a + i));/*可知,a指向数组第一个元素 ,commented by zhaoyulong,2016.8.14*/
		*(a + i) = i + 2;
	}

	printf("\n访问数组元素的第三种方式:\n");
	p = a;
	for (int i = 0; i < sizeof(a) / sizeof(a[0]); i++)
	{		
		printf("a[%d]:%d ", i, *(p + i));
		*(p + i) = i + 3;
	}

	printf("\n访问数组元素的第四种方式:\n");
	p = a;
	for (int i = 0; i < sizeof(a) / sizeof(a[0]); i++)
	{
		printf("a[%d]:%d : ", i, p[i]);
		p[i] = i + 4;
	}

	printf("\n当前数组的元素值:\n");
	for (int i = 0; i < sizeof(a) / sizeof(a[0]); i++)
	{
		printf("a[%d]:%d ", i, a[i]);
	}



	printf("\n----------------------------数组名和指针的不同点----------------------------\n");
	p = a;
	printf("数组sizeof大小,sizeof(a):%d \n", sizeof(a));
	printf("数组sizeof大小,sizeof(p):%d \n", sizeof(p));

	//a的类型int *;&a的类型是int (*)[5]。
	printf("\n(addr) a,&a :0x%x,0x%x\n", a, &a);


	//a的类型int *;&a+1的类型是int (*)[5]。
	/*指针的运算,x86下,a+1,加了4;&a+1,加了12 ,commented by zhaoyulong,2016.8.14*/
	printf("\n(addr) a+1,&a +1:0x%x,0x%x\n", a+1, &a+1);
	//printf("\n(addr) &(a+1):0x%x\n", &(a + 1));/*编译错误,指针的运算,& 要求左值或函数指示符ommented by zhaoyulong,2016.8.14*/

	print_array_elment(a, 5);
	/*数组做实参,只能传入数组名,或数组的某个元素值(数组的某个元素值做实参,和一般的实参又没有什么不同了) ,commented by zhaoyulong,2016.8.14*/
	//print_array_elment(a[5], 5);

	print_array_elment_by_pointer(a, 5);

	printf("\n----------------------------指针与数组的各种结合与区分-----------------------\n");
	int *ptr[3];
	int n = 1;
	ptr[0] = &n;
	printf("(value) ptr, &ptr[0] ,ptr[0], &n:%x,%x,%x,%x\n", ptr, &ptr[0], ptr[0], &n);

	int (*ptr1) [3];//定义指针,ptr1是一个指向3个整形值的数组的指针;并未定义任何数组;
	//错误,ptr1是指向数组的指针
	//ptr1[0] = 1;

	//错误,ptr1并未初始化,以下是野指针操作;(*ptr1)类似是int a[3]数组的数组名a;
	//(*ptr1)[0] = 1;

	//错误,指针类型不能赋给int类型
	//(*ptr1)[0] = &n;

	//sizeof 操作符(operator),返回一个对象或者类型所占的内存字节数。
	/*sizeof(*ptr1)结果等同于对数组int a[3]进行sizeof(a) ,但不能据此说int (*ptr1) [3]定义了一个数组commented by zhaoyulong,2016.8.14*/
	printf("sizeof(*ptr1):%d , sizeof(ptr1)%d\n", sizeof(*ptr1),sizeof(ptr1));

	//报错,ptr1未初始化
	//printf("ptr1:0x%x; ptr1+1:0x%; (*ptr1):0x%x; (*ptr1)+1:0x%x \n", ptr1, ptr1 + 1, (*ptr1), (*ptr1) + 1);

	int a6[3] = { 1 };
	
	//错误,指针类型不匹配
	//ptr1 = a6;

	ptr1 = &a6;
	//前面加12;后面加4;
	printf("ptr1:0x%x; ptr1+1:0x%x; (*ptr1):0x%x; (*ptr1)+1:0x%x \n", ptr1, ptr1 + 1, (*ptr1), (*ptr1) + 1);

	/*定义一个数组元素类型不同的,对比,加深理解 ,commented by zhaoyulong,2016.8.14*/
	char (*ptr2)[3];//ptr2 是一个数组指针;指向形如 char a[3]的数组; 
	printf("sizeof(*ptr2):%d , sizeof(ptr2):%d\n", sizeof(*ptr2), sizeof(ptr2));
	char a7[3] = { 'a' };
	ptr2 = &a7;
	printf("ptr2:0x%x; ptr2+1:0x%x; (*ptr2):0x%x; (*ptr2)+1:0x%x \n", ptr2, ptr2 + 1, (*ptr2), (*ptr2) + 1);

	char a8[4] = { 'b' };
	//报错,指针类型不同;除非指针类型强制转换
	//ptr2 = &a8;

	

	/*再推广一下 ,commented by zhaoyulong,2016.8.14*/
	int * (*ptr3)[3];//定义一个指针ptr3,该指针指向形如int * a[5]的数组 
	printf("sizeof(*ptr3):%d , sizeof(ptr3):%d\n", sizeof(*ptr3), sizeof(ptr3));
	int * a9[3];
	ptr3 = &a9;
	//前加12;后加4;
	printf("ptr3:0x%x; ptr3+1:0x%x; (*ptr3):0x%x; (*ptr3)+1:0x%x \n", ptr3, ptr3 + 1, (*ptr3), (*ptr3) + 1);

	/*定义一个数组元素类型不同的,对比,加深理解 ,commented by zhaoyulong,2016.8.14*/
	char *(*ptr4)[5];
	printf("sizeof(*ptr4):%d , sizeof(ptr4):%d\n", sizeof(*ptr4), sizeof(ptr4));
	char *a10[5];
	ptr4 = &a10;
	//前加20;后加4;
	printf("ptr4:0x%x; ptr4+1:0x%x; (*ptr4):0x%x; (*ptr4)+1:0x%x \n", ptr4, ptr4 + 1, (*ptr4), (*ptr4) + 1);
	

	printf("\n----------------------------字符串和字符数组 -----------------------\n");
	char *p2 = "helloworld!";/*字符串 ,commented by zhaoyulong,2016.8.14*/
	char a2[] = { 'h','e','l','l','o','!' };/*字符数组 ,6个元素,commented by zhaoyulong,2016.8.14*/

	//字符数组a3 a4 a5 中的字符和字符串都相同;不同的是这些字符数组的地址不同;
	char a3[] = { "hello!" };
	char a4[] = "hello!";
	char a5[] = { 'h', 'e' ,'l' ,'l' ,'o', '!' ,'\0' };
	//char a6[] = p2;/*字面字符串可以初始化字符数组,但指向字符串的指针不能初始化字符数组 ,commented by zhaoyulong,2016.8.14*/

	//通过指针不能获得字符串的长度
	printf("sizeof(p2):%d,strlen(p2):%d \n", sizeof p2, strlen(p2));

	//strlen函数不能用于求字符数组中字符串的长度,除非能确保字符数组中存在字符串结束标志'\0'
	printf("sizeof(a2):%d,strlen(a2):%d \n", sizeof a2, strlen(a2));
	printf("sizeof(a3):%d,strlen(a3):%d \n", sizeof a3, strlen(a3));
	printf("sizeof(a4):%d,strlen(a4):%d \n", sizeof a4, strlen(a4));
	printf("sizeof(a5):%d,strlen(a5):%d \n", sizeof a5, strlen(a5));

	printf("\n----------------------------指针的指针(二级指针)-----------------------\n");

	char c = 'b';
	char *pc = &c;
	char **ppc;
	//报错,指针类型不匹配;指针只有在相同类型的变量之间赋值时,才不报错!
	//ppc = &c;
	ppc = &pc;

	printf("&c 0x%x, pc 0x%x, &pc 0x%x,ppc 0x%x,&ppc 0x%x\n",&c,pc,&pc,ppc,&ppc);
	printf("c %c ,*pc %c,**pc %c\n",c,*pc,**ppc);


	printf("\n----------------------------函数的指针(二级指针)-----------------------\n");
	
	int (*pfun) (int a, int b);//定义指向函数的指针pfun,注意与函数int * fun(int a,int b)的区别
	pfun = max;//使pfun指向max函数
	int m1 = 0,m2 =0;
	m1 = pfun(3, 0);
	m2 = pfun(3, 4);
	printf("m1=%d,m2=%d\n", m1,m2);


	printf("\n----------------------------二维数组与指针-----------------------\n");
	int aa[3][4] = { {1,2,3,4},{5,6} };
	printf("a[0][2] %d, *(a[0]+2) %d\n", aa[0][2], *(aa[0] + 2));
	printf("\n访问二维数组元素的第一种方式:\n");
	for (int i = 0; i < 3; i++)
	{
		for (int j = 0; j< 4; j++)
		{
			printf("aa[%d][%d] %d  ", i, j, aa[i][j]);
		}
		printf("\n");
	}

	int (*pp)[4];
	pp = aa;

	printf("\n访问二维数组元素的第二种方式:\n");
	for (int i = 0; i < 3; i++)
	{
		for (int j = 0; j < 4; j++)
		{
			printf("pp[%d][%d] %d  ", i, j, pp[i][j]);
		}
		printf("\n");
	}

	printf("\n访问二维数组元素的第三种方式:\n");
	for (int i = 0; i < 3; i++)
	{
		for (int j = 0; j < 4; j++)
		{
			printf("*(pp[%d]+%d) %d  ", i, j,*(pp[i]+j));
		}
		printf("\n");
	}

	printf("\n访问二维数组元素的第四种方式:\n");
	for (int i = 0; i < 3; i++)
	{
		for (int j = 0; j < 4; j++)
		{
			printf("*(*(pp+%d) + %d)  %d  ", i, j, *(*(pp+i) + j) );
		}
		printf("\n");
	}

	printf("\n访问二维数组元素的第五种方式:\n");
	for (int i = 0; i < 3; i++)
	{
		for (int j = 0; j < 4; j++)
		{
			printf( "(*(pp + %d) )[%d]  %d  ", i, j, (*(pp + i) )[j] );
		}
		printf("\n");
	}

	
	
    return 0;
}

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网