指针和数组
之前有篇文章已经写过数组了 这里我直接画图代替一些数组基础话 忘记的可以翻着看看.
如果我们要访问一个数组的首元素 会有A[0]这种形式的访问 如果用指针如何访问数组元素呢
int\p = &A[0] 然后我们就可以用指针来操作数组元素了 比如&A[2] = A+2 如果要解引用(A+2)即可 可以把A存放到指针 用指针代替A进行解引用和运算
int *p = &A[0]; 也可以写作 int *p = A; 解引用的话 *(P+i)
#include<stdio.h>
int main()
{
int arry[5] = { 2,4,6,8,10 };
int* parry = NULL;
parry = arry;
for (size_t i = 0; i < 5; i++)
{
printf("address of a[%d]\n", parry+i);
printf("address of a[%d] = %d\n", i,*(parry + i));
}
};
数组作为参数传递
#include<stdio.h>
int Sumarry(int A[])
{
int sum = 0;
int size = sizeof(A) / sizeof(A[0]);
for (size_t i = 0; i < size; i++)
{
sum += A[i];
}
return sum;
}
int main()
{
int arry[] = { 1,2,3,4,5 };
int result = Sumarry(arry);
printf("the result was = %d\n", result);
}
大家觉得这个程序的运行结果是多少? 运行结果是1 为什么?
也就是说并不像我们想的那样 会将一整个数组全部传过来 仅仅会传递数组元素首地址,所以我们要想在被调函数中使用数组(知道他的大小)就必须传递一个数组的大小的参数
#include<stdio.h>
int Sumarry(int A[],int s)
{
int sum = 0;
//int size = sizeof(A) / sizeof(A[0]);
for (size_t i = 0; i < s; i++)
{
sum += A[i];
}
return sum;
}
int main()
{
int arry[] = { 1,2,3,4,5 };
int size = sizeof(arry) / sizeof(arry[0]);
int result = Sumarry(arry,size);
printf("the result was = %d\n", result);
}
这下结果就符合我们的期望值了。 还可以通过形参改变实参的值的内容
指针和字符串
之前已经写过很多关于字符串的文章了 感兴趣的可以自己去看一下
这里仅对指针操作字符串进行代码编写
#include<stdio.h>
void printfchar(char* c)
{
int i = 0;
while (*(c + i) !='\0')
{
printf("%c", *(c + i));
i++;
}
printf("\n");
}
int main()
{
char str[] = "hello";
printfchar(str);
}
也可以去掉i 利用指针进行自增 C++
在内存中分析这个程序
字符数组的大小 = 字符数组元素数量
字符数组存放字符串大小 =字符数组元素数量+1 乱总结的 迷糊的别看
char*和char[]辨析
char str[] = “hello”; 编译器会在栈区给这个数组分配一段空间存放 因此我们可以通过指针修改字符串的内容
char*str = “hello”;之前我也说过这种初始化 形式上与字符串数组没有区别 但字符串常量存放在常量区 就是之前画的那个static区 里面的数据是无法修改的 同时他也会一直存在 直到程序运行结束。
写一段程序加深一下记忆
#include<stdio.h>
char* strA()
{
char str[] = "hello";
return str;
}
int main()
{
char* address = strA();
printf("%s", address);
}
str创建在栈区后 当被调函数执行完成之后 编译器会清空分配给字符串数组的空间 因此当主调函数去接收返回的首地址时,会发生乱码 因为这段内存已经被清空了 如果改成char*str = “hello”; 因为是保存在常量区 所以不会被清空。
网站标题:CV鼻祖洋芋
原创文章,作者:locus,如若转载,请注明出处:https://blog.cvpotato.cn/forward-code/c-2/82/
本博客所发布的内容,部分为原创文章,转载注明来源,网络转载文章如有侵权请联系站长!