C语言指针简单知识及常见简单编程题

本文详细探讨了计算机科学中的指针概念,包括指针定义、类型及其作用,野指针的产生与处理,以及指针运算和数组操作实例。通过实例演示如何使用指针进行数组访问和解决编程挑战,如打印数组、字符串逆序、求和及水仙花数查找。
摘要由CSDN通过智能技术生成

指针

指针定义:

在计算机科学中,指针(Pointer)是编程语言中的一个对象,利用地址,它的值直接指向(points to)存在电脑存储器中另一个地方的值。由于通过地址能找到所需的变量单元,可以说,地址指向该变量单元。因此,将地址形象化的称为“指针”。意思是通过它能找到以它为地址的内存单元。

即说白了指针就是存放地址的,而我们可以通过指针来寻找指针所指的指针内容

指针的大小在32位平台是4个字节,在64位平台是8个字节。

指针和指针类型:

指针的定义方式为

type + *

而指针类型有:

char

int

short

long

float

double

指针类型的意义是:

指针的类型决定了指针向前或者向后走一步有多大(距离)

也就是决定了对指针解引用的时候有多大的权限(能操作几个字节)

比如: char* 的指针解引用就只能访问一个字节,而 int*的指针的解引用就能访问四个字节。

野指针

野指针概念:

野指针就是指针指向的位置是不可知的(随机的,不正确的,没有明确限制的)

野指针成因:

1. 指针未初始化

2. 指针越界访问

3. 指针指向的空间释放

指针运算

1.指针加减整数

#define N_VALUES 5
float values[N_VALUES];
float *vp;
//指针+-整数;指针的关系运算
for (vp = &values[0]; vp < &values[N_VALUES];)
{
     *vp++ = 0;      //该代码相当于:*vp = 0;
                     //              vp++
}

2.指针减指针

nt my_strlen(char *s)     //指针-指针只有再同一块内存才有意义
{
       char *p = s;
       while(*p != '\0' )
              p++;
       return p-s;
}

3.指针的关系运算

for(vp = &values[N_VALUES]; vp > &values[0];)
{
    *--vp = 0;     //该代码相当于:--vp;      *vp=0;
}

指针和数组:

例子:

int main()
{
 int arr[10] = {1,2,3,4,5,6,7,8,9,0};
    printf("%p\n", arr);
    printf("%p\n", &arr[0]);
    return 0;
}

在这个例子中arr代表的是数组arr的地址

用指针来访问数组:

例子如下

int main()
{
    int arr[] = {1,2,3,4,5,6,7,8,9,0};
    int *p = arr; //指针存放数组首元素的地址
    int sz = sizeof(arr)/sizeof(arr[0]);
    for(i=0; i<sz; i++)
   {
        printf("&arr[%d] = %p  p+%d = %p\n", i, &arr[i], i, p+i);   //前后对比
   }
    return 0;
}

 C语言指针常见简单编程题

1.使用指针打印数组内容

写一个函数打印arr数组的内容,不使用数组下标,使用指针

arr是一个整形一维数组

int main() 
{
	
	int a[10] = { 1,2,3,4,5,6,7,8,9,10 };
	int* p = a;
	int sz = sizeof(a) / sizeof(a[0]);        //sz=数组的长度
	for (int i = 0; i < sz; i++)
	{
		printf("%d ", *p);       //对a解引用
		p++;                    //获取p的下一个地址
	}
}

 

2.字符串逆序

写一个函数,可以逆序一个字符串的内容

char *back(char * arr,int len) 
{
	char* right = arr + strlen(arr) - 1;    
	char* left = arr;

	while (right > left)            //交换内容
	{
		char temp = *left;
		*left = *right;
		*right = temp;


		right--;
		left++;
	}
	return arr;    
}



int main()
{
	char a[] = "my little world";
	int len = sizeof(a) / sizeof(a[0]);
	char *test = back(a, len);
	printf("%s ", test);
}

 

3.计算求和

求Sn=a+aa+aaa+aaaa+aaaaa的前5项之和,其中a是一个数字

例如2+22+222+2222+22222

int main() 
{
	int a = 0;
	int n = 0;
	int temp = 0;
	scanf_s("%d,%d", &a , &n);        //首先输入一个前n项以及计算的数字
	int sum = 0;
	for (int i = 0; i < n; i++) 
	{ 
		temp = temp * 10 + a;         
		sum = sum + temp;
	}
	printf("%d", sum);

}

4.打印水仙花数

求出0~100000之间所有“水仙花数”并输出

水仙花数的定义为:“水仙花数”是指一个n位数,其各位数字的n次方之和确好等于该数本身,如:153=1^3+5^3+3^3,则153是一个“水仙花数”。

int main() 
{
	for (int i = 0; i < 100000; i++) 
	{
		int sum = 0;
		int temp = i;
		int count = 1;
		while (temp/10)                  //有多少位数
		{
			temp = temp / 10;             //每次循环除10,则次方加一
			count++;
		}
		
		temp = i;

		while (temp)                    //每一位数的次方和
		{
			
			sum = sum + pow(temp % 10, count);     //每次循环都加上该位数的和
			temp = temp / 10;                      //每次循环temp除10

		}
		if (sum == i)                                //判断是否相等
		{
			printf("%d ", i);
		}
	}
}

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值