【C语言】有关指针练习

一.有关数组名练习

//一维数组
#include <stdio.h>
#include <windows.h>
#include <stdlib.h>
int main()
{
	int a[] = { 1,2,3,4 };
	printf("%d\n", sizeof(a));//16   
	//数组首地址,大小当然是数组的大小,这里的a不仅仅是一个指针,还代表了一个数组
	printf("%d\n", sizeof(a + 0));//4    数组首元素地址
	printf("%d\n", sizeof(*a));//4       数组首元素a[0]
	printf("%d\n", sizeof(a + 1));//4    a[1]地址
	printf("%d\n", sizeof(a[1]));//4     a[1]
	printf("%d\n", sizeof(&a));//4       数组首地址,这时候仅代表一个地址
	printf("%d\n", sizeof(*&a));//16     数组首地址解引用,代表整个数组
	printf("%d\n", sizeof(&a + 1));//4   下一个数组地址
	printf("%d\n", sizeof(&a[0]));//4    首元素地址
	printf("%d\n", sizeof(&a[0] + 1));//4 a[1]地址
	system("pause");
	return 0;
}
  • 数组名可以用来替代指针,但还有更多含义;
  • 将数组名赋予指针时,意为首元素地址;
  • 仅当sizeof(数组名),&数组名时,为相当数组首地址;
  • sizeof(&a),此时,&a仅为一个指针,所以大小为4;
  • 但 &a+1 ,代表下一个数组地址;
  • a[1] 相当于 *(a+1);
// 字符数组
#include <stdio.h>
#include <windows.h>
int main()
{
	char arr[5] = {'a','b','c','d','e'};
	printf("%d\n", sizeof(arr));//5
	printf("%d\n", sizeof(arr+3));//4
	printf("%d\n", sizeof(*arr));//1
	printf("%d\n", sizeof(arr+1));//4
	printf("%d\n", sizeof(arr[1]));//1
	printf("%d\n", sizeof(&arr));//4
	printf("%d\n", sizeof(&arr+1));//4
	printf("%d\n", sizeof(&arr[0]));//4
	printf("%d\n", sizeof(&arr[0]+1));//4
	//字符数组不可以用strlen()函数,因为strlen以\0为界
	printf("%d\n", strlen(arr));//19
	printf("%d\n", strlen(arr + 0));//19
	printf("%d\n", strlen(&arr[0] + 1));//18
	system("pause");
	return 0;
}
//字符串数组
#include <stdio.h>
#include <windows.h>
int main()
{
	char arr[] = "abcde";
	printf("%d\n", sizeof(arr));//6
	printf("%d\n", sizeof(arr+3));//4
	printf("%d\n", sizeof(*arr));//1
	printf("%d\n", sizeof(arr+1));//4
	printf("%d\n", sizeof(arr[1]));//1
	printf("%d\n", sizeof(&arr));//4
	printf("%d\n", sizeof(&arr+1));//4
	printf("%d\n", sizeof(&arr[0]));//4
	printf("%d\n", sizeof(&arr[0]+1));//4

	printf("%d\n", strlen(arr));//5
	printf("%d\n", strlen(arr + 0));//5
	printf("%d\n", strlen(&arr[0] + 1));//4
	system("pause");
	return 0;
}
//字符串指针
#include <stdio.h>
#include <windows.h>
int main()
{
	char * arr = "abcde";
	printf("%d\n", sizeof(arr));//4
	printf("%d\n", sizeof(arr + 3));//4
	printf("%d\n", sizeof(*arr));//1
	printf("%d\n", sizeof(arr + 1));//4
	printf("%d\n", sizeof(arr[1]));//1
	printf("%d\n", sizeof(&arr));//4
	printf("%d\n", sizeof(&arr + 1));//4  
	//这里是指向指针的下一个内存单元(4字节),未定义。
	printf("%d\n", sizeof(&arr[0]));//4
	printf("%d\n", sizeof(&arr[0] + 1));//4

	printf("%c\n", *(arr + 3));//d
	printf("%c\n", *arr);//a
	printf("%c\n", *(arr + 1));//b

	printf("%d\n", strlen(arr));//5
	printf("%d\n", strlen(arr + 0));//5
	printf("%d\n", strlen(&arr[0] + 1));//4
	system("pause");
	return 0;
}
//二维数组
#include <stdio.h>
#include <windows.h>
int main()
{
	int a[3][4] = { 1 ,0,0,1,0,0,0,0,0,0,0,0};
	printf("%d\n", sizeof(a));//48
	printf("%d\n", sizeof(a[0][0]));//4   int为4
	printf("%d\n", sizeof(a[0]));//16     第一个元素的地址  是个数组名4*4
	printf("%d\n", sizeof(a[0] + 1));//4    a[0][1]的地址
	printf("%d\n", sizeof(*(a[0] + 1)));//4 a[0][1]的值
	printf("%d\n", sizeof(a + 1));//4       第二个元素的地址,相当于a[1]
	printf("%d\n", sizeof(*(a + 1)));//16   第一个元素,4个int,4*4
	printf("%d\n", sizeof(&a[0] + 1));//4   a[1]的地址
	printf("%d\n", sizeof(*(&a[0] + 1)));//16  第二个元素,4个int 4*4
	printf("%d\n", sizeof(*a));//16       第一个元素的值
	printf("%d\n", sizeof(a[3]));//16     第四个元素的地址,已经越界
	system("pause");
	return 0;
}
  • 这里的a[0],*(a+0)为数组名,所以为16
#include <stdio.h>
#include <windows.h>
int main()
{
	double a[3][4] = { 1.0,1.0,1.0,1.0,1.5,1.5,1.5,1.0 };
	printf("%d\n", sizeof(a));//96
	printf("%d\n", sizeof(a[0][0]));//8  double 为8
	printf("%d\n", sizeof(a[0]));//32     第一个元素8*4
	printf("%d\n", sizeof(a[0] + 1));//4    a[0][1]的地址              
	printf("%d\n", sizeof(*(a[0] + 1)));//8 a[0][1]的值
	printf("%d\n", sizeof(a + 1));//4       第二个元素的地址,相当于a[1]   
	printf("%d\n", sizeof(*(a + 1)));//32   第一个元素
	printf("%d\n", sizeof(&a[0] + 1));//4   a[1]的地址                      
	printf("%d\n", sizeof(*(&a[0] + 1)));//32  第二个元素
	printf("%d\n", sizeof(*a));//32       第一个元素
	printf("%d\n", sizeof(a[3]));//32     第四个元素,已经越界
	system("pause");
	return 0;
}

二.指针试题

例1.

	int a[5] = { 1,2,3,4,5 };
	int * ptr = (int *)(&a + 1);
	printf("%d %d", *(ptr + 1), *(a + 1)); // 无效数字  2
  • &a+1 为下个数组地址

例2.

	int a[4] = { 2,3,4,5};
	int * ptr1 = (int *)(&a + 1);
	char *ptr2 = (char *)((int)a +1);
	printf("%x %x", ptr1[-1], *ptr2);   //5   3000000
  • 2 小端存储为10 00 00 00;

例3.

	int a[3][2] = { {1,2},{3,4},{5,6} };
	int *p = a[2];
	printf("%d",p[1]);   //6  p[1]相当于*(p+1)

例4.

	char *a[] = { "work","at","al" ,"happy"};
	char **pptr[] = {a+3,a+2,a+1,a};
	char ***ppptr = pptr;
	printf("%s\n", **++ppptr);  //al
	printf("%s\n", *--*++ppptr+3);  //k
	printf("%s\n", *ppptr[-2]+3);//py
	printf("%s\n", ppptr[-2][-1]+1);//l

找到一篇好文章:https://blog.csdn.net/ljob2006/article/details/4872167

发布了53 篇原创文章 · 获赞 49 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/weixin_43550839/article/details/99602694
今日推荐