注:此学习笔记由观看B站眯眯眼老师C语言高级编程所得。UP主视频地址(方便再次复习)
一、内存与指针
内存:
1.每一个夹层都有地址
2.相邻的夹层地址连续
3.内存中一个夹层存储的数据是一字节(8位二进制)
为什么要有地址?(方便引用)
每当声明一个新的变量,会在内存里面寻找一个4字节的区域,内存里会有一个变量信息表,包含了变量名、地址、数据类型。比如给a=10值,编译器会根据地址查到信息表中a的地址进行赋值。
指针:一个变量它存储了其他变量的地址。
int *p; //声明一个整形指针
int a;
p=&a ;//将变量a的地址取出来存到p(取址)
*p=1; //指针的取值操作改变a的值,此时a=1
*p=*p+1;//取值操作可以使用运算符,此时a=2
p=p+1;//p的值发生改变
指针加1根据指针数据类型而定,如果时int的数据类型加1相当于加4,char型加1就是加1。
指针的数据类型:标志着你只能存储相应的数据类型变量的地址。
二、值传递与引用传递
//引用传递
#include<stdio.h>
void add(int *a){
*a=*a+1; //*a是取值操作
}
int main()
{
int a;
a=10;
add(&a);//将a的地址传入
printf("%d",a);
return 0;
}
三、指针与数组
数组名与指针功能非常相似
数组名非常类似于一个指针变量,但是数组又不等于指针变量。比如A=A+1就是错误的,A表示途中的数组A[10]。如果直接问打印A,就是打印数组A的首地址。
数组成员数量计算方法:
int size=sizeof(A)/sizeof(A[0]);//数组大小除以单个成员数量大小
#include<stdio.h>
//通过自定义函数得到数组中成员的求和值并且打印
int sum(int A[],int size){
int i ,total=0;
for(i=0;i<size;i++){
total=total+A[i];
}
return total;
}
int main()
{
int A[]={1,2,3,4,5,6,1,2,3,1,2,423,123,1,2};
printf("%d\n",sizeof(A));
int size=sizeof(A)/sizeof(A[0]);
printf("%d\n",size);
int total=sum(A,size);
printf("%d\n",total);
return 0;
}
结果:
60
15
579
如果将程序int size=sizeof(A)/sizeof(A[0]); printf("%d\n",size);
放进子函数sum内结果大为不同。
#include<stdio.h>
//通过自定义函数得到数组中成员的求和值并且打印
int sum(int A[]){
int i ,total=0;
int size=sizeof(A)/sizeof(A[0]);
for(i=0;i<size;i++){
total=total+A[i];
}
return total;
}
int main()
{
int A[]={1,2,3,4,5,6,1,2,3,1,2,423,123,1,2};
printf("%d\n",sizeof(A));
int total=sum(A);//引用传递
printf("%d\n",total);
return 0;
}
视频中老师的编译结果为60与3,而我自己编译的结果为60与1。产生这种差异是由于视频中老师采用的是网上的编译环境,传统电脑的指针变量是4字节,因为电脑是32位,现在很多电脑是64位,所以指针会出现8字节,因此不必惊慌。
那为什么将int size=sizeof(A)/sizeof(A[0]);
放入sum中结果就会不同?这是因为int sum(int A[]) 中的int A[]等价于int *A,int total=sum(A);
传入的是数组A的首地址而不是整个数组,只占了4字节。因此在函数sum中计算sizeof(A)的结果是1,sizeof(A[0])也是1。
sizeof(A[0])中A[0]等价于 *A;就是数组中第一个成员。
# include <stdio.h>
void f(int pArr[], int len)
{
pArr[3] = 88;
}
int main(void)
{
int a[6] = {1,2,3,4,5,6};
printf("%d\n", a[3]);
f(a, 6);
printf("%d\n", a[3]);
return 0;
}
结果:
4
88
# include <stdio.h>
void f(int * pArr, int len)
{
pArr[3] = 88;
}
int main(void)
{
int a[6] = {1,2,3,4,5,6};
printf("%d\n", a[3]);
f(a, 6);
printf("%d\n", a[3]);
return 0;
}
结果:
4
88