碎碎念:做指针题的时候我仿佛回到了原点,总觉得目的是为了把框架搭建起来,我胡说的哈31
1.利用指针变量将一个数组中的数据反向输出。
/*1.利用指针变量将一个数组中的数据反向输出。*/
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
int main(void)
{
int arr[10] = {0};
int n = sizeof(arr) / sizeof(arr[0]);
srand(time(NULL));
printf("原始数组为: ");
int i = 0;
for(;i < n;i++)
{
arr[i] = rand() % 100;
printf("%5d",arr[i]);
}
printf("\n");
int *p = arr; //指针指向数组元素
printf("反响输出数组元素:");
for(int i = n - 1;i >= 0;i--)
{
printf("%5d", *(p + i));
}
printf("\n");
return 0;
}
2.利用指针变量计算下标为奇数的数组的和;
/*2.利用指针变量计算下标为奇数的数组的和;*/
#include <stdio.h>
int main(void)
{
int arr[] = {1,2,3,4,5,6,7,8,9};
int n = sizeof (arr) / sizeof (arr[0]);
printf("数组元素为:");
int i = 0,j = 0;
for(;i < n;i++)
{
printf("%3d",arr[i]); // 打印数组元素,%3d指定宽度为3,右对齐
}
printf("\n");
printf("数组下标为:");
for(int i =0;i < n;i++)
{
printf("%3d",i); //打印数组下标,指定宽度为3,右对齐
}
printf("\n");
int sum = 0;
int *p; //声明指针变量p
p = arr; //将数组首地址渎职给指针变量
for(int i =0;i < n;i++)
{
if(i % 2 != 0)
{
sum += *(p + i); //如果下标i为奇数,累加指针p后移i个位置的元素值
}
}
printf("下标为奇数的数组元素之和为: %d\n",sum);
return 0;
}
3.确认整型,字符型,浮点型指针变量的大小;
are you sure?在Linux中Ubuntu中gcc编译器中指针变量类型大小都是8个字节
然后我又在devc++中编译(?????)
因此我得出了结论(我也不知道对不对),32位都是4个字节指针类型,使用的是64位系统且编译器支持64位指针,所有类型的指针大小都是8字节指针类型(?不是很懂哈哈哈)
4.利用指针变量输出字符数组中的所有字符。
/*4.利用指针变量输出字符数组中的所有字符。*/
#include <stdio.h>
int main(void)
{
char str[] = "Hello,World";
int n = sizeof(str) / sizeof(str[0]);
char *ptr = str; //定义一个指向字符的指针
printf("输出字符数组中的字符串:%s\n",str); //输出字符串用%s
int i = 0;
printf("利用指针变量遍历字符数组输出字符:");
for(;i < n;i++)
{
printf("%c",*ptr); //注意这里使用%c是因为str是一个字符数组而非一个字符串
ptr++; //移动指针到下一个字符
}
printf("\n");
return 0;
}
这个是让用户自己输入字符串的(此时要注意fgets函数自动添加换行符,所以不需要咱们额外添加)
/*4.利用指针变量输出字符数组中的所有字符。*/
#include <stdio.h>
int main(void)
{
char str[32] = {0};
printf("请输入一个字符串:");
fgets(str,sizeof(str),stdin);
int n = sizeof(str) / sizeof(str[0]);
char *ptr = str; //定义一个指向字符的指针
printf("通过指针变量输出结果:");
int i = 0;
for(;i < n;i++)
{
printf("%c",*ptr); //注意这里使用%c是因为str是一个字符数组而非一个字符串
ptr++; //移动指针到下一个字符
}
return 0;
}
5.利用指针变量删除字符数组中的某个字符。(例如: hello 删除l ----> heo)
****这个算法相当经典,可以引申到删除任何数组中的字符,淦,暂时没听太懂就先这样吧。
/*5.利用指针变量删除字符数组中的某个字符。(例如: hello 删除l ----> heo)*/
//此时要注意删除字符不是把它变没而是让后面不删除的字符取覆盖到要删除的字符的位置
#include <stdio.h>
int main(void)
{
char str[64] = {0};
printf("请输入一个字符串:");
fgets(str,sizeof(str),stdin); //标准输入,如果把\n也作为遍历里的就不需要做处理换行符
char ch;
printf("请输入一个待删除的字符:");
ch = getchar(); //从键盘获取字符,它的返回值会接受字符ch //sanf("%c",&ch);
char *p,*q; //定义两个指针变量
for(p = str,q = str; *p ; p++) //pq指向字符数组首地址,p指针遍历所输入的字符串,q指针是要删除的字符
{
if(*p != ch)
{
if(p != q) //增加一个判断语句,会把效率提高,很多不必要的语句将不再执行
*q = *p; //当p指向元素不等于待删字符且p指向元素不等于q指向元素,将p指向元素赋给q指向的元素,去覆盖
q++; //q继续往下走看是不是待删除字符
}
}
*q = '\0'; //'\0'对应的值就是0,不是字符数组的话不可以是*q = 0;,因为sr[64] = {0}很有可能结束了后面是0,停止不了
假设不是一个字符数组 /*q - str*/; //指针相减,当前元素前第n个元素的地址
puts(str); //输出后结果,fgets函数多一个换行符,,没有处理,所以输出结果会多一个换行
return 0;
}
碎碎念:这个运行出来的换行符我暂时还不会删,等俺会了,回来改,或者有没有大佬帮忙纠错哈哈