说明文中*p++和*s++都是一个东西,不做字面上的统一了。
因为右结合性,*p++ 其实就是 *(p++)
1.strlen的实现
#include <stdio.h> main(){ char str[]= "Abcde"; printf("\n string = %s length = %d \n",str,str_length(str)); } int str_length (const char *s){ int length = 0; while (*s++){ length++; } return (length); }其实*s++的过程
#include <stdio.h> main( ) { char str[]= "Abcde"; char* ptr = "12345"; *ptr++; printf ("\n string = %s length = %d \n",ptr,str_length (ptr)); printf ("\n string = %s length = %d \n",str,str_length (str)); } int str_length (const char *s) { int length = 0; while (*s++) { length++ ; } return (length) ; }输出:
#include <stdio.h> void add(int *s) { *s++; } int str_length (char *s) { int length = 0; while (*s++) { length++ ; } return (length) ; } main( ) { int a=1; int *b=&a; char str[]= "Abcde"; char* ptr = "12345"; *ptr++; ptr="def"; add(b); printf ("\n string = %s length = %d \n",ptr,str_length (ptr)); printf ("\n string = %s length = %d \n",str,str_length (str)); }
void add(int *s) { (*s)++; }
#include <stdio.h> void xstrcpy ( char *t, char *s ){ while ( *s != '\0' ) { *t = *s ; s++ ; t++ ; } *t = '\0' ; } void strcpy(char *s,char *t){ //while((*s++=*t++)!='\0') //表达式通'\0'的比较是多余的,因为只需要判断表达式的值是否为0即可。 while(*s++=*t++) ; } //标准库实现 char * strcpy2(char *s,char *t){ char *r=s; while(*s++=*t++) ; return r; } void main() { char source[] = "Abcde" ; char target[20] ; strcpy ( target, source ) ; printf ( "\nsource string = %s", source ) ; printf ( "\ntarget string = %s", target ) ; } /* 想经过函数调用改变某个变量的值,就要传入变量的地址。 如果变量是基本类型,要传入对应的指针类型。 如果变量是指针,要传入指针的指针。 */
int a = 0x55aa;
change_value(&a, 0xaa55);
这样a的值改变了,真正的情况是参数传递后,编译器做了一个参数拷贝过程,比如声明一个整型指针pCopy = &a;
这样,pCopy只是传进来参数&a的一份拷贝,但是他们都指向了a的地址,因此用这种方法可以改变a 的值。
既然ptr也是一个变量,我要在函数内部改变它,那么就传递一个指向ptr的指针!也就是二级指针!
6.函数返回指针
绝不返回函数中本地变量的地址。
函数返回指针可以用如下方法:
1.可以用malloc分配内存,并返回这个内存的地址
2.返回指针参数
注意函数中可以声明一个新的结构struct,然后返回结构,但是不可以返回临时指针。
struct tt{ int size; int slabs; }; void main() { void *s=malloc(12); struct tt *t1; memset(s,0,12); t1=(struct tt*)s; t1->size=1; t1->slabs=2; }
局部变量的作用域一般认为是在函数体内。但是根据C99标准,该说法有了变化。在新的标准中,允许即时定义局部变量,示例如下:
for( int i = 0; i < MAXSIZE; i++ )
{
….
}
例子中的局部变量i的作用域即在for循环的花括号中,当for循环结束的时候,局部变量i的生存周期同时结束。也就是说,在下一个for循环中,你仍然可以再次重新定义并使用名为i的局部变量。该语法只能在C99之后的新的C编译器中使用, 例如VC2005、VC2008、gcc4.2及以上版本。但是,该语法带来了编程风格的变化,而且变量隐含在了执行程序中,无论是代码的阅读和维护都有较大的困难,因此工程项目中不建议使用该语法。
所以对于在ADS编译器下对于函数参数是结构体的传递,还是传入指针比较好。既高效(省去建立备份的时间),又节省栈空间。
13.指针大小
32位是4个字节,32=4*8
64位是8个字节,64=8*8
在64位的linux下:
而visual studio里默认是win32平台,指针是4个字节大小:
需要修改为x64平台
这时候显示指针是8个字节: