目录
指针
取地址运算
sizeof
代表int在内存中代表四个字节,32个比特
运算符
获得变量的地址,它的操作数必须是地址
取地址的对象必须是明确的变量,如果右边不是一个变量,而是&(a+b)
试试用&输出变量的地址,相邻的变量的地址,
9C与98多了四个字节(十六进制)
i是先定义的变量,放在更高的地方,在stack中分配内存是自顶向下分配的
&a和a和&a[0]是相等的,找到的是同一位置
初识指针
就是保存地址的变量。普通变量的值是实际的值,而指针变量的值是具有实际值的变量的地址。
int i;
int* p= &i; //*号表示p是一个指针,指向的是一个int,用&i把i的地址交给p
int* p,q;
int *p,q;
以上两种情况中*号远离或靠近p都表示p是一个指针,而后面的q只是一个int变量,如果想要表达q是一个指针,只需在写为*q。
作为参数的指针:
指针与数组
#include<stdio.h>
void minmax(int a[],int len, int *max,int *min);
int main(void)
{
int a[] = {1,2,3,4,5,6,7,8,9,12,13,14,16,17,21,23,55};
int min,max;
printf("main sizeof(a)=%lu\n",sizeof(a));
minmax(a,sizeof(a)/sizeof(a[0]),&min,&max);
printf("min=%d,max=%d\n",min,max);
return 0;
}
void minmax(int a[],int len, int *min,int *max)
{
int i;;
printf("minmax sizeof(a)=%lu\n",sizeof(a));
*min = *max=a[0];
for(i=1;i<len;i++){
if(a[i]<*min){
*min = a[i];
}
if(a[i]>*max){
*max= a[i];
}
}
}
可以看到,在main中a的大小为68,在minmax中a的大小为4(4刚好和一个指针的大小是一样的),对于函数参数里面的数组的sizeof,返回的是int *的sizeof,而不是int数组的sizeof
继续试验:在main和minmax中分别输出a的地址,如下
发现两个输出的结果是一样的,说明minmax中的a数组其实和main中的a数组是同一个数组。
进一步说明:
因而得出结论:int a[]实际上就是指针,就算是改为int *a编译运行也是正确的。
以下四种函数原型是等价的:
int sum(int *ar,int n);
int sum(int *,int);
int sum(int ar[],int n);
int sum(int [],int);
数组变量是特殊的指针。
这次只是从慕课C语言入门初步学习指针,下面这个挺详细的(大佬可以让我放到这里以后复习吗?不过你应该看不到,我就默默放在这了,谢谢)
让你不再害怕指针——C指针详解(经典,非常详细)_程序老兵的博客-优快云博客_指针
字符类型
char字符
char是一种整数,也是一种特殊的类型:字符。这是因为:
用单引号表示的字符字面量:'a','1'
"也是一个字符,printf和scanf里用%c来输入输出字符,试验如下:
空格算一个字符,两个字符相减得到它们在表中的距离。
大小写转换:
字母在ASCII表中是顺序排列的
大写字母和小写字母是分开排列的,并不在一起
'a'-'A'可以得到两段之间的距离,于是
a+'a'-'A'可以把一个大写字母变成小写字母,而a+'A'-'a'可以把一个小写字母变成大写字母
一道作业OJ题:
#include<stdio.h>
int main(void)
{
int letter,blank,digit,other,n;
char ch;
digit = letter = other = blank =0;
scanf("%d",&n);
getchar();
int i;
for(i = 1;i<=n;i++){
ch = getchar();
if((ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z'))letter++;
else if(ch>='0'&&ch<='9')digit++;
else if(ch==' '||ch=='\n')blank++;
else other++;
}
getchar();
printf("letter = %d, blank = %d, digit = %d, other = %d",letter,blank,digit,other);
return 0;
}
逃逸字符
\b使程序回退一格,退到
之前存放b的位置,A就占领了这个位置。
制表位是每行的固定位置,一个\t使得输出从下一个制表位开始,用\t才能使得上下两行对齐。如上
部分整理自慕课网“程序设计入门——C语言”课程,部分文字及图片来自原课程
如有错误,欢迎纠正
如有侵权,请联系删除