资讯

精准传达 • 有效沟通

从品牌网站建设到网络营销策划,从策略到执行的一站式服务

【C语言】指针进阶(二)-创新互联

这里写目录标题
  • 一级目录
    • 整型数组
    • 字符数组
    • 字符串长度
  • 指针和数组面试题
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

成都创新互联是专业的延寿网站建设公司,延寿接单;提供成都网站设计、成都做网站,网页设计,网站设计,建网站,PHP网站建设等专业做网站服务;采用PHP框架,可快速的进行延寿网站开发网页制作和功能扩展;专业做搜索引擎喜爱的网站,专业的做网站团队,希望更多企业前来合作!一级目录 整型数组

sizeof(数组名)——计算整个数组的大小
&数组名——取出整个数组的地址
除此之外,所有的数组名都是数组首元素的地址

int main() {int a[] = {1,2,3,4 };
	printf("%d\n", sizeof(a));			//4*4=16
	printf("%d\n", sizeof(a + 0));		//a+0是第一个元素的地址,计算地址的大小
	printf("%d\n", sizeof(*a));			//*a是数组的第一个元素,计算第一个元素(整型)的大小
	printf("%d\n", sizeof(a + 1));		//a+1是第二个元素的地址,计算地址的大小
	printf("%d\n", sizeof(a[1]));		//计算第二个元素(整型)的大小
	printf("%d\n", sizeof(&a));			//计算一个地址的大小
	printf("%d\n", sizeof(*&a));		//取地址再解引用,计算数组的大小
	printf("%d\n", sizeof(&a + 1));		//数组后面的空间的地址的大小
	printf("%d\n", sizeof(&a[0]));		//第一个元素地址的大小
	printf("%d\n", sizeof(&a[0] + 1));	//第二个元素地址的大小
	return 0;
}
字符数组
char arr[] = {'a','b','c','d','e','f' };
	printf("%d\n", sizeof(arr));		//数组大小	
	printf("%d\n", sizeof(arr + 0));	//第一个元素地址的大小
	printf("%d\n", sizeof(*arr));		//第一个元素(字符)的大小
	printf("%d\n", sizeof(arr[1]));		//第二个元素(字符)的大小
	printf("%d\n", sizeof(&arr));		//地址的大小
	printf("%d\n", sizeof(&arr + 1));	//数组后面的空间的地址的大小
	printf("%d\n", sizeof(&arr[0] + 1));//第二个元素地址的大小
字符串长度
char arr[] = {'a','b','c','d','e','f' };
	printf("%d\n", strlen(arr));		//找'\0',随机值	
	printf("%d\n", strlen(arr + 0));	//随机值
	printf("%d\n", strlen(*arr));		//把a(97)当作地址解引用,出错
	printf("%d\n", strlen(arr[1]));		//把b(98)当作地址,出错
	printf("%d\n", strlen(&arr));		//随机值
	printf("%d\n", strlen(&arr + 1));	//数组后面的空间找'\0',随机值-6
	printf("%d\n", strlen(&arr[0] + 1));//第二个元素开始找'\0',随机值-1
char arr[] = "abcdef";
	printf("%d\n", sizeof(arr));		//数组大小,7	
	printf("%d\n", sizeof(arr + 0));	//第一个元素地址的大小
	printf("%d\n", sizeof(*arr));		//第一个元素(字符)的大小
	printf("%d\n", sizeof(arr[1]));		//第二个元素(字符)的大小
	printf("%d\n", sizeof(&arr));		//地址的大小
	printf("%d\n", sizeof(&arr + 1));	//数组后面的空间的地址的大小
	printf("%d\n", sizeof(&arr[0] + 1));//第二个元素地址的大小
char arr[] = "abcdef";
	printf("%d\n", strlen(arr));		//数组长度,6	
	printf("%d\n", strlen(arr + 0));	//同上
	printf("%d\n", strlen(*arr));		//把a(97)当作地址解引用,出错
	printf("%d\n", strlen(arr[1]));		//把b(98)当作地址,出错
	printf("%d\n", strlen(&arr));		//6
	printf("%d\n", strlen(&arr + 1));	//数组后面的空间找'\0',随机值
	printf("%d\n", strlen(&arr[0] + 1));//第二个元素开始找'\0',5
char* p = "abcdef";
	printf("%d\n", sizeof(p));		//指针变量大小
	printf("%d\n", sizeof(p + 1));	//第二个元素指针变量的大小
	printf("%d\n", sizeof(*p));		//第一个元素(字符)的大小
	printf("%d\n", sizeof(p[0]));		//第一个元素(字符)的大小
	printf("%d\n", sizeof(&p));		//地址的大小
	printf("%d\n", sizeof(&p + 1));	//地址的大小
	printf("%d\n", sizeof(&p[0] + 1));//第二个元素地址的大小
char* p = "abcdef";
	printf("%d\n", strlen(p));		//数组长度,6
	printf("%d\n", strlen(p + 1));	//5
	printf("%d\n", strlen(*p));		//第一个元素(ASCII码),出错
	printf("%d\n", strlen(p[0]));	//同上
	printf("%d\n", strlen(&p));		//从p的位置开始找'\0',随机值
	printf("%d\n", strlen(&p + 1));	//从p的位置加4(或8)开始找'\0',随机值
	printf("%d\n", strlen(&p[0] + 1));//5
//二维数组
	int a[3][4] = {0 };
	printf("%d\n", sizeof(a));				//3*4*sizeof(int)=48
	printf("%d\n", sizeof(a[0][0]));		//第一行第一个元素的地址,4
	printf("%d\n", sizeof(a[0]));			//a[0]表示整个第一行,计算第一行的大小4*sizeof(int)=16
	printf("%d\n", sizeof(a[0] + 1));		//a[0]表示第一行第一个元素的地址,a[0]+1表示第二个元素的地址,计算地址的大小
	printf("%d\n", sizeof(*(a[0] + 1)));	//计算第一行第二个元素(整型)的大小
	printf("%d\n", sizeof(a + 1));			//a是二维数组的数组名,表示二维数组首元素的地址,即第一行的地址,a+1表示第二行地址的大小
	printf("%d\n", sizeof(*(a + 1)));		//取地址再解引用,计算第二行的大小
	printf("%d\n", sizeof(&a[0] + 1));		//第二行的地址的大小
	printf("%d\n", sizeof(*(&a[0] + 1)));	//第二行的大小
	printf("%d\n", sizeof(*a));				//第一行的大小
	printf("%d\n", sizeof(a[3]));			//一行的大小,sizeof()内部是不计算的,只根据类型计算大小
指针和数组面试题
int main() {char str1[] = "hello";
	char str2[] = "hello";
	char* str3 = "hello";
	char* str4 = "hello";
	if (str1 == str2) {printf("str1 and str2 are same.\n");
	}
	if (str3 == str4) {printf("str3 and str4 are same.\n");
	}
	return 0;
}

str1[]和str2[]是两个数组,str1和str2代表数组首元素地址,比较的是两个不同的地址
str3和str4是两个指针变量,里面写入了常量字符串,比较的是两个相同的地址

char* ps="hello";
* ps='w';

会报错,因为常量字符串的内容不能修改

2
int main() {int a[5] = {1,2,3,4,5 };
	int* ptr = (int*)(&a + 1);
	printf("%d,%d", *(a + 1), *(ptr - 1));
	//a+1表示第二个元素地址,解引用为第二个元素
	//*ptr表示数组之后空间,*(ptr-1)向前移一个整型,表示数组最后一个元素
	return 0;
}
3
struct Test {int Num;
	char* pcName;
	short sDate;
	char cha[2];
	short sBa[4];
}*p;				//假设p的值为0x100000,结构体Test类型的变量大小是20字节
int main() {printf("%p\n", p + 0x1);					//指针+1,跳过20字节,即0x14
	printf("%p\n", (unsigned long)p + 0x1);		//整型+1
	printf("%p\n", (unsigned int*)p + 0x1);		//+1整型,即+4
	return 0;
}

指针类型决定了指针的运算

4
int main() {int a[4] = {1,2,3,4 };
	int* ptr1 = (int*)(&a + 1);			//数组后面空间
	int* ptr2 = (int*)((int)a + 1);		//地址差1,实际偏移一个字节,再整形指针解引用
	printf("%x ", ptr1[-1]);			//*(ptr1-1)
	printf("%x", *ptr2);				//如果是小端存储则为(01) 00 00 00 02
	return 0;
}
5
int main() {int a[3][2] = {(0,1),(2,3),(4,5) };	//逗号表达式,(1,3,5,0,0,0)
	int* p;
	p = a[0];
	printf("%d", p[0]);						//1
	return 0;
}
6
int main() {int a[5][5];	//5行5列
	int(*p)[4];		//p指向一个地址
	p = a;
	printf("%p,%d\n", &p[4][2] - &a[4][2], &p[4][2] - &a[4][2]);
	//p指向a,p+1指向a+4,p+2指向a+8...
	//p[4][2]指向a+19
	//指针-指针=两个指针之间元素个数,-4
	//10000000 00000000 00000000 00000100
	//11111111 11111111 11111111 11111011
	//11111111 11111111 11111111 11111100即FFFFFFFC
	return 0;
}
7
int main() {int a[2][5] = {1,2,3,4,5,6,7,8,9,10 };
	int* ptr1 = (int*)(&a + 1);		//数组后面空间
	int* ptr2 = (int*)(*(a + 1));	//第一行后面空间
	printf("%d,%d", *(ptr1 - 1), *(ptr2 - 1));	//10,5
	return 0;
}
8
int main() {char* a[] = {"work","at","ali" };
	char** pa = a;
	pa++;
	printf("%s\n", *pa);	//at
	return 0;
}
9
int main() {char* c[] = {"enter","new","point","first" };
	char** cp[] = {c + 3,c + 2,c + 1,c };	//交叉指向c
	char*** cpp = cp;						//cpp放cp地址
	printf("%s\n", **++cpp);				//cp中c+2→point
	printf("%s\n", *-- * ++cpp + 3);		//cp中c+1,进行--得到c→enter,进行+3打印e之后的内容er
	printf("%s\n", *cpp[-2] + 3);			//**(cpp-2)得到c+3→first,进行+3打印s之后的内容st
	printf("%s\n", cpp[-1][-1] + 1);		//*(cpp-1)得到c+2,*(*(cpp-1)-1)得到new的地址,进行+1后打印n之后的内容ew
	return 0;
}

你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧


当前文章:【C语言】指针进阶(二)-创新互联
标题链接:http://cdkjz.cn/article/doooje.html
多年建站经验

多一份参考,总有益处

联系快上网,免费获得专属《策划方案》及报价

咨询相关问题或预约面谈,可以通过以下方式与我们联系

大客户专线   成都:13518219792   座机:028-86922220