C从头开始

[quote]0、关于main函数需要注意两点:
0.1、[K&R]书上的main函数定义写成main(){...}形式,不写返回值类型也不写参数列表,这是Old Style C的风格。Old Style C规定不写返回值类型就表示返回int型,不写参数列表就表示参数类型和个数没有明确指出。这种宽松的规定会导致很多复杂的Bug产生,不幸的是现在的C标准为了兼容旧的代码仍然保留了这种语法,但是读者绝不应该继续使用这种语法。
0.2、其实系统在调用main函数时是传参数的,所以main函数最标准的形式应该是int main(int argc, char *argv[])。C标准也规定了int main(void)这种形式,如果不使用系统传进来的两个参数也可以写成这种形式。但除了这两种形式之外,以其它形式定义main函数都是错误的或不可移植的。[/quote]
C变量
[url]http://lavasoft.blog.51cto.com/62575/186951[/url]
1、变量存在哪里?
①栈区(Stack):用于存放局部变量(包括方法的参数等)
②堆区(Heap):程序员通过C的函数(比如malloc)申请的内存区域,使用完毕后释放(或由OS自动释放)
③全局区(静态区(Static)):整个程序运行期间一直存在

demo.c

#include <stdio.h>
void main(){

}


2、数组与指针
#include <stdio.h>

int main(void){
int intArr[]={1,3,45,-4,89};
int * pt;//定义一个存放指针(地址)的变量
int i;
pt=&intArr[0];//把数组首地址赋给指针变量pt;也可以这么写:pt=intArr
for(i=0;i<5;i++){
printf("array input:%d",intArr[i]);
printf(" ;");
printf("point input:%d",*(pt++));//这样也可以把数组里有值打印出来。
/*这种写法比用数组下标的方式快,原因是:编译器会将a[i]解析成*(a+i);*/
printf("\n");
}
getch();
return 0;
}

3、字符串、字符、数组
#include <stdio.h>
int change(char *str){
str="start study C"; /*在这里也可以看出 双引号引起来的 是个地址*/
printf("%s \n",str);
return 0;
}
int main(void){
char *a="hello";/*声明字符串,"hello" 在内存中的首地址赋给指针变量a*/
char arr[]={'w','o','r','l','d','\0'};/*定义一个字符串,最后一个'\0'是亮点*/
printf("%s,%s \n",a,arr);
printf("%d \n",change(a));
getch();
}

4、结构体
#include <stdio.h>
#include <string.h>

struct s{
int a;
char b[10];/*要给长度*/
char * str;
};

int main(void){
struct s ss;
ss.a=100;
//ss.b="error"; //直接赋值是不行的
/*方法一*/
//struct s ss={12,"hello","world"};
/*方法二*/
//strcpy(ss.b,"abc"); //
/*方法三*/
//char *p="hello world";
//memcpy(ss.b,p,strlen(p)+1);
/*end method*/
ss.str="hello world!";
printf("%d\n %s\n %s\n",ss.a,ss.b,ss.str);
}


二、细枝末节
scanf函数是在对应的地址上写内容.
scanf( "%d,%d" ,a,b);这是在地址值a和b上进行写内容.
要注意区分a的值与a的地址&a之间的区别.
如int a = 1; 假设&a = 0xff2a;
scanf("%d", a); //这是在地址值为1的地址上写内容,并不改变变量a的值.
scanf("%d", &a);//这是在地址值为0xff2a的地址上写内容,这样会改变变量a的值.

#include <stdio.h>
main()
{
int a=10,*p,**q;//q为放指针的指针的变量。
p=&a;
q=&p;
printf("%d\n",**q);
getch();
}


[table]
|1.int i; -----定义整型变量|
|2.int *p; -----P为指向整型变量的指针变量|
|3.int a[n]; -----定义数组a,它有n个元素|
|4.int *p[n]; -----定义指针数组,它由N个指向整型数据的指针元素组成|
|5.int (*p)[n]; -----P为指向有N个整型元素组成的一维数组的指针变量|
|6.int f(); -----带回整型函数值的函数|
|7.int *p(); -----带回指针值的函数|
|8.int (*p)(); -----指向函数的指针,该函数带回整型数值|
|9.int **p; -----指向指针的指针|
[/table]


注:c/c++不能返回一个数组,只能返回指向数组的一个指针;

malloc的全称是memory allocation

2、运算符的优先级顺序:
++(后自增) > *(解引用) > !=(不等于) > =(赋值)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值