字符串常量

#include<stdio.h>
int main()
{
char arr1[] = "hellow";
char arr2[] = "hellow";
char* arr3 = "hellow";
//由于指向的是相同常量,所以指向同一个地方更省空间
char* arr4 = "hellow";
//这里指针可以指向一个字符串,但是字符串是一个常量,无法用指针进行更改
//*p="w";是错误的
//相当于const char* arr3 = "hellow";
if (arr1 == arr2)
printf("相同\n");
else
printf("不同\n");
if (arr3 == arr4)
printf("相同\n");
else
printf("不同\n");
return 0;
}

指针数组(和二维数组相同)

#include<stdio.h>
int main()
{
int a[] = { 1,2,3,4,5 };
int b[] = { 2,2,3,4,5 };
int c[] = { 4,2,3,4,5 };
int* p[] = { &a,&b,&c };
//printf("%d\n", *p[0]);
//这里存储的是指针数组里面的下表为0的内容
//是1个地址,并且是a的首元素的地址
int i = 0, j = 0;
for (i = 0;i < 3;i++)
{
j = 0;
for (j = 0;j < 5;j++)
{
//printf("%d ", *(p[i] + j));
//这里的p[i]表示p里面的一个内容,由于存放的是地址,+j是里面的地址+它的步长
printf("%d ", p[i][j]);//这里也会被解释成上面的情况
}
printf("\n");
}
return 0;
}
int main()
{
//float i = 9.0;
//printf("%d\n", i);//这里是用浮点数把9.0放进去
//读取的时候还是浮点型,但是打印的时候是整形打印
////再打印的时候把一个浮点数用整形进行打印

float i = 9.0;//这里是用浮点数把9.0放进去
int* p = (int*)&i;//这里是先把浮点数先转换成int类型,然后用p指向i,直接打印
printf("%d\n", *p);
return 0;
}

数组指针

数组指针主要用于二级指针的访问,即指针数组的访问

int main()
{
int a[][5] = { {1,2,3,4,5},{2,3,4,5,6},{3,4,5,6,7,} };
int(*p)[5] = &a;//这里指向的是数组里面的一个数组名,即指向的是整个第一个数组
int i = 0, j = 0;
for (i = 0;i < 3;i++)
{
for (j = 0;j < 5;j++)
{
printf("%d ", *(*(p + i) + j));//*(p+i)是三个一级数组,+j是指向每一级数组里面的二级数组
}
printf("\n");
}
return 0;
}

容易记混的难点

---------------------------------
text(int*arr)//这里接受的以也是整个二级数组的地址
{
printf("%d ", *(arr + 3));//4
}
-----------------------------------------
text(int* arr[])
//这里是一个数组,一个存放指针的指针数组,和实参不一样,错误
{
printf("%d ", *(arr + 3));
}
----------------------------------------
text(int arr)//这是一个整形,但是传过来的是一个地址不一样
{}
-----------------------------------------------------
text(int arr[])//这里接受的是整个数组,和原来的一样
{
printf("%d ", *(arr + 3));
printf("%d ", arr[3]);
}
---------------------------------------------------
text(int(*arr)[5])
//这里是*arr是来代替出递过来的二级数组,
//但是arr确实一级数组,即指向的是整个数组
{
printf("%d ", *(*arr + 3));
}
--------------------------------------------------------
text(int** arr)
//不能这样写,传过来的是一个指向数组的指针,不是一个二级指针
{
printf("%d ", *(arr + 3));
}
--------------------------------------------------------
int main()
{
int arr[][5] = { {1,2,3,4,5},{2,3,4,5,6},{3,4,5,6,7} };
text(arr);//这里是arr首元素的地址,是整个二级数组的地址,相当于*arr
return 0;
}

​​相关题目

第一题:求输出结果

#include<string.h>
int i;//当全局变量没有被初始化是,默认是0
int main()
{
i--;//
if (i > sizeof(i))
//类型的sizeof(i)的结果是unsigned int。因此,如果我们想将i与sizeof(i)进行比较,我们需要将i的类型转换为unsigned int
//因此,i转换为无符号的结果是,使i变成一个非常大的数字(其符号位转换为一个数字)
printf(">\n");
else
printf("<\n");
return 0;
}

第二题:求输出结果

int main()
{
int a = 0;
int n = 0;
int sum = 0, ret = 0;;
int i = 0;
scanf("%d %d", &a,&n);
for (i = 0;i < n;i++)
{
ret = ret * 10 + a;
sum = sum + ret;
}
printf("sum = %d\n", sum);
return 0;
}

第三题:使用指针访问数组里面的元素

int main()
{
int arr[] = { 1,2,3,4,5,6,7,8,9 };
int* p = arr;
int i = 0;
for (i = 0;i < 9;i++)
{
printf("%d\n", *(p + i));
}
return 0;
}

第四题:求1-10000之间的水仙花数

#include<math.h>
int main()
{
int i = 0, n = 0,tmp = 0;
int sum = 0;
for (i = 0;i < 10000;i++)
{
//判断一共有几位数,n
tmp = i;
n = 1;
while (tmp/10)
{
n++;
tmp = tmp / 10;
}
//判断是否是水仙花数
tmp = i;
sum = 0;
while (tmp)
{
sum += pow(tmp % 10, n);
tmp = tmp / 10;
}
if (sum == i)
printf("%d ", sum);
}
return 0;
}

菱形的打印

效果:C语言指针进阶及相关题目_指针

代码和理解

思路:

1、让每一行的打印数量都和i相关的联系

2、星号后面不用打印空格

int main()
{
int line = 0;
scanf("%d", &line);//输入行数:是上半部分的行数
int i = 0;
for (i = 0;i < line;i++)//打印7行,这里一共是7行
{
//输出上半部分
int j = 0;
//打印一行
//' '
for (j = 0;j < line - i - 1;j++)
{
printf(" ");
}
//打印'*'
for (j = 0;j < 2 * i + 1;j++)
{
printf("*");
}
printf("\n");
}
for(i=0;i<line-1;i++)//这里一共是6行
{
//输出下半部分
//输出' '
int j = 0;
for (j = 0;j <=i ;j++)
{
printf(" ");
}
//输出'*'
for (j = 0;j < 2 * (line - i)-3;j++)
{
printf("*");
}
printf("\n");
}
return 0;
}

1块钱1一瓶饮料,两个空瓶换一瓶饮料,20块钱能喝多少瓶

int main()
{
int ping = 0;//瓶子计数器
scanf("%d", &ping);
int kong = ping;//空瓶计数器
int tmp = 0;
do {
tmp = kong % 2;//先计算有多少个先把剩余的瓶子存起来
kong = kong / 2;//再在计算剩余的瓶子能换多少瓶子
ping = kong + ping;//加进总数里面
kong = kong + tmp;//再把存起来的瓶子和新的剩余的瓶子加起来
} while (kong != 1 && kong != 0);
//规律是2n-1
printf("%d\n", ping);
return 0;
}

数组排序,把一个数组中的偶数放在数组后面,奇数放在前面

思路:

(用循环)

1、从左向右判断指针指向的是否是偶数,如果是,就停下,如果是否,则指向右一个

2、从右向左判断是否是奇数,如果是,就停下,否就指向左一个

将两个数对换

循环

void print(int* arr, int sz)
{
int i = 0;
for (i = 0;i < sz; i++)
{
printf("%d ", arr[i]);
}
}
void move(int* arr, int sz)
{
int left = 0;
int right = sz - 1;
while (left < right)
{
while ((left<right)&&(arr[left] % 2==1))//偶数
{
left++;
}
while ((left < right) &&(arr[right] % 2==0))//奇数
{
right--;
}
int tmp = 0;
tmp = arr[left];
arr[left] = arr[right];
arr[right] = tmp;
}
}

#include<string.h>
int main()
{
int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
int sz = sizeof(arr) / sizeof(arr[0]);
move(arr,sz);
print(arr, sz);
return 0;
}