1.strlen()与sizeof()
1、操作
strlen(char*)函数求的是字符串的实际长度,它求得方法是从开始到遇到第一个’\0’,如果你只定义没有给它赋初值,这个结果是不定的,它会从aa首地址一直找下去,直到遇到’\0’停止。
而sizeof()返回的是变量声明后所占的内存数,不是实际长度。
2、参数类型
sizeof可以用类型做参数,strlen只能用char*做参数,且必须是以’’\0’'结尾的。
3、类型
sizeof是操作符(关键字),strlen是函数。
char sArr[] = "ILOVEC";
/*用strlen()求长度*/
printf("sArr的长度=%d\n", strlen(sArr));
很显然,上面示例代码的运行结果为 6(因为不包括结束字符 null)
char sArr[] = "ILOVEC";
/*用sizeof求长度*/
printf("sArr的长度=%d\n", sizeof(sArr));
相对于函数 strlen,这里的示例代码运行结果为 7(因为它包括结束字符 null)。
3、注意:
1、strlen()函数的类型必须为char类型,而sizeof可以为任意类型
2、strlen()函数包含在string.h文件中
指针数组和数组指针
int *p1[5]; //指针数组
int (*p2)[5]; //数组指针
1. 指针数组
int *p1[5]; //指针数组
参考代码
#include <stdio.h>
const int MAX = 3;
int main ()
{
int var[] = {10, 100, 200};
int i, *ptr[MAX];
for ( i = 0; i < MAX; i++)
{
ptr[i] = &var[i]; /* 赋值为整数的地址 */
}
for ( i = 0; i < MAX; i++)
{
printf("Value of var[%d] = %d\n", i, *ptr[i] );
}
return 0;
}
/*输出一下结果
Value of var[0] = 10
Value of var[1] = 100
Value of var[2] = 200
*/
#include <stdio.h>
const int MAX = 4;
int main ()
{
const char *names[] = {
"Zara Ali",
"Hina Ali",
"Nuha Ali",
"Sara Ali",
};
int i = 0;
for ( i = 0; i < MAX; i++)
{
printf("Value of names[%d] = %s\n", i, names[i] );
}
return 0;
}
/* 输出一下结果
Value of names[0] = Zara Ali
Value of names[1] = Hina Ali
Value of names[2] = Nuha Ali
Value of names[3] = Sara Ali
*/
指针数组常用在主函数传参,在写主函数时,参数有两个,一个确定参数个数,一个这是指针数组用来接收每个参数(字符串)的地址
int main(int argc, char *argv[])
2. 数组指针
int (*p2)[5]; //数组指针
int a[3][4];
int (*p)[4]; //该语句是定义一个数组指针,指向含4个元素的一维数组。
p=a; //将该二维数组的首地址赋给p,也就是a[0]或&a[0][0]
p++; //该语句执行过后,也就是p=p+1;p跨过行a[0][]指向了行a[1][]
int arr[5]={1,2,3,4,5};
int (*p1)[5] = &arr;
/*下面是错误的*/
int (*p2)[5] = arr;
void fun(int (*P)[4]);//子函数中的形参,指针数组
a[3][4] = {0};//主函数中定义的二维数组
fun(a);//主函数调用子函数的实参,是二维数组的首元素首地址
int (* arrPtr)[10] = NULL; // 一个指针,它指向一个有10个int元素的数组
int matrix[3][10]; // 3行,10列的数组
// 数组名称是一个指向第一个元素的指针,也就是第一行的指针
arrPtr = matrix; // 使得arrPtr指向矩阵的第一行
(*arrPtr)[0] = 5; // 将5赋值给第一行的第一个元素
arrPtr[2][9] = 6; // 将6赋值给最后一行的最后一个元素
++arrPtr; // 将指针移动到下一行
(*arrPtr)[0] = 7; // 将7赋值给第二行的第一个元素
在初始化赋值后,arrPtr 指向矩阵的第一个行,正如矩阵名称 matrix 一样。在这种情况下,使用 arrPtr 获取元素的方式与使用 matrix 完全一样。例如,赋值运算(*arrPtr)[0]=5 等效于 arrPtr[0][0]=5 和 matrix[0][0]=5。
然而,与数组名称 matrix 不同的是,指针名称 arrPtr 并不代表一个常量地址,如运算 ++arrPtr 所示,它进行了自增运算。这个自增运算会造成存储在数组指针的地址增加一个数组空间大小,在本例中,即增加矩阵一行的空间大小,也就是 10 乘以 int 元素在内存中所占字节数量。
参考文章:
1.指针数组和数组指针
2. 指针数组与数组指针详解
3. 数组指针和指针数组的区别,C语言数组指针和指针数组区别详解
4. 数组指针和指针数组的区别