C语言:关于指针

xiaoxiao2025-10-08  21

#include<stdio.h> #include<assert.h> int NumberWords( const char *str) { assert(str != NULL); const char *p=str; const char *q=str; int i=0; while(*q != '\0')//当q指针指向值不为结束符时 { while(*p ==' ') { p++;//遇到空格,指针往后移 } q=p;//将p的地址传给q q++; p++;//q和p移到下一指针 if(*q ==' ')//如果指向值为空格,i+1 { i++; } } i++;//遇到结束符后i+1 return i; } int main() { char arr[]=" I am a Student"; int a = NumberWords(arr); printf("%d\n",a); getchar(); return 0; } 答案:4 //12的二进制为0000 1100 //int main() //{ // int a=12; // int b=a>>1; // int b1=a>>2; // int b2=a<<1; // int b3=a<<2; // // printf("%d\n",b); // printf("%d\n",b1); // printf("%d\n",b2); // printf("%d\n",b3); // getchar(); // return 0; //}

//指针和数组 //1、在 32位系统下,不管什么样的指针类型,其大小都为 4byte(4字节) //2、“”号前面的数据类型只是说明指针所指向的内存里存储的数据类型 //3、int p = NULL和p=NULL的区别 //intp = NULL;通过编译器查看 p 的值为 0x00000000。这句代码的意思是:定义一个指针 变量 p,其指向的内存里面保存的是 int 类型的数据;在定义变量 p 的同时把 p 的值设置为 0x00000000,而不是把p 的值设置为 0x00000000。这个过程叫做初始化,是在编译的时候进行的。 //【数组】 //1、当定义一个数组 a 时,编译器根据指定的元素个数和元素的类型分配确定大小(元素类型大小元素个数)的一块内存,并把这块内存的名字命名为 a。名字 a 一旦 与这块内存匹配就不能被改变。a[0],a[1]等为 a 的元素,但并非元素的名字。数组的每一个 元素都是没有名字的。 //2、而关键字 sizeof 求值是在编译的时候。 //3、左值:编译器认为 x 的含义是 x 所代表的地址。这个地址在编译的时候确定,编译器在一个特定的区域保存这个地址,右值只有在运行时才能知道代表的是什么内容 //4、以指针的形式访问和以下标的形式访问指针: //1),以指针的形式:(p+4)。先取出 p 里存储的地址值,假设为 0x0000FF00,然后加 上 4 个字符的偏移量,得到新的地址 0x0000FF04。然后取出 0x0000FF04 地址上的值。 //2),以下标的形式:p[4]。编译器总是把以下标的形式的操作解析为以指针的形式的操 作。p[4]这个操作会被解析成:先取出 p 里存储的地址值,然后加上中括号中 4 个元素的偏 移量,计算出新的地址,然后从新的地址中取出值。 //5、以指针的形式访问和以下标的形式访问数组: //1),以指针的形式:(a+4)。 a 这时候代表的是数组首元素的首地址,假设为 0x0000FF00, 然后加上 4 个字符的偏移量,得到新的地址 0x0000FF04。然后取出 0x0000FF04 地址上的 值。 //2),以下标的形式:a[4]。编译器总是把以下标的形式的操作解析为以指针的形式的操 作。a[4]这个操作会被解析成:a 作为数组首元素的首地址,然后加上中括号中 4 个元素的 偏移量,计算出新的地址,然后从新的地址中取出值。 //char 类型数据 1 个字符的大小就为 1 个 byte(字节)。 //*(a+1): a,&a 的值是一样的,但意思不一样,a 是数组首元素的首地址,也就是 a[0]的 首地址,&a 是数组的首地址,a+1 是数组下一元素的首地址,即 a[1]的首地址,&a+1 是下一 个数组的首地址 a ==a[0]!=&a //6、定义分配内存,而声明没有。定义只能出现一次,而声明可以出现多次。定义为指针,声明为数组。 // // //三、define和const的区别 //区别: //1、在 C 语言中,const 修饰的只读变量必须在定义的同时初始化。const 修饰的仍然是变量,只不过是只读属性罢了。const 修饰的数据是有类型的,而 define 宏定义的数据没有类型。 //2、为了安全,在定义一些宏常数的时候用 const 代替,编译器会给 const 修饰的只读变量做类型校验,减少错误的可能。 //3、const 修饰的只读变量不能用来作为定义数组的维数,也不能放在 case 关键字后面。

转载请注明原文地址: https://www.6miu.com/read-5037551.html

最新回复(0)